1) 简单介绍窗口类结构体
窗口类结构体是用来储存某一类窗口的信息,窗口类结构体包含了一个窗口类的全部信息。
比如:窗口的图标、菜单栏、背景颜色、窗口的消息处理等等
2.窗口类结构体 WNDCLASS和WNDCLASSEX
窗口类结构体有:WNDCLASS、WNDCLASSEX
WNDCLASS 为早期的版本
WNDCLASSEX 为新增的版本
PS:为什么有WNDCLASSEX还要保留老版本的WNDCLASS,
这主要的为了兼容以前使用老版本开发的Win32程序所保留的。
3.窗口类结构体的成员变量(代码来源于VS2017编译器)
先说老版本的WNDCLASS吧(此处使用WNDCLASSW宽字符)
typedef struct tagWNDCLASSW {
UINT style; // 类风格
WNDPROC lpfnWndProc; // 窗口的处理过程
int cbClsExtra; // 指定紧随在 WNDCLASS 数据结构后分配的字节数
int cbWndExtra; // 指定紧随在窗口实例之后分配的字节数
HINSTANCE hInstance; // 窗口类所在模块的实例句柄
HICON hIcon; // 窗口类的图标
HCURSOR hCursor; // 窗口类的光标
HBRUSH hbrBackground; // 窗口类的背景画刷
LPCWSTR lpszMenuName; // 窗口类的菜单资源名
LPCWSTR lpszClassName; // 窗口类的名称
} WNDCLASSW
再说新增版本的WNDCLASSEX(此处使用WNDCLASSEXW宽字符)
typedef struct tagWNDCLASSEXW {
UINT cbSize; // 窗口类结构体的内存大小
/* Win 3.x */
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCWSTR lpszMenuName;
LPCWSTR lpszClassName;
/* Win 4.0 */
HICON hIconSm; // 窗口类的任务栏图标
} WNDCLASSEXW
可见新增版本比老版本多了两个成员变量:cbSize 和 hIconSm
4.窗口类结构体的选择
有老版本的和新增版本两个的窗口类结构体,
首选当然是新增版本的,毕竟新增版本的功能比老版本的多
2)窗口类结构体的使用
WNDCLASS:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // 窗口类的消息处理过程
/* 老版本的窗口类结构体 */
WNDCLASS wndclass;
wndclass.style = 0; // 窗口类型为缺省类型
wndclass.lpfnWndProc = WndProc; // 定义窗口处理函数
wndclass.cbClsExtra = 0; // 窗口类无扩展
wndclass.cbWndExtra = 0; // 窗口实例无扩展
wndclass.hInstance = hInstance; // 当前实例句柄
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); // 窗口的最小化图标为缺省图标
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); // 窗口采用箭头光标
wndclass.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH)); // 窗口背景为白色
wndclass.lpszMenuName = NULL; // 窗口无菜单
wndclass.lpszClassName = L"CLASSNAME"; // 窗口类名
WNDCLASSEX:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // 窗口类的消息处理过程
/* 新增版本的窗口类结构体 */
WNDCLASSEX wndclassex;
wndclassex.style = 0; // 窗口类型为缺省类型
wndclassex.lpfnWndProc = WndProc; // 定义窗口处理函数
wndclassex.cbClsExtra = 0; // 窗口类无扩展
wndclassex.cbWndExtra = 0; // 窗口实例无扩展
wndclassex.hInstance = hInstance; // 当前实例句柄
wndclassex.hIcon = LoadIcon(NULL, IDI_APPLICATION); // 窗口的最小化图标为缺省图标
wndclassex.hCursor = LoadCursor(NULL, IDC_ARROW); // 窗口采用箭头光标
wndclassex.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH)); // 窗口背景为白色
wndclassex.lpszMenuName = NULL; // 窗口无菜单
wndclassex.lpszClassName = L"CLASSNAME"; // 窗口类名
/* 新增的成员变量 */
wndclassex.cbSize = sizeof(WNDCLASSEX); // 窗口类的内存大小
wndclassex.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // 窗口类菜单栏的图标