Win32 程序开发:窗口类结构体WNDCLASS和WNDCLASSEX

1) 简单介绍窗口类结构体

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);                 // 窗口类菜单栏的图标

猜你喜欢

转载自blog.csdn.net/qq_31243065/article/details/83513795