在一个视窗显示在屏幕上之间,首先就是要进行视窗的注册工作,在此使用的是 RegisterClass进行视窗类别的注册。RegisterClass函数的功能为注册一个窗口类,供以后在对CreateWindow或CreateWindowEx函数的调用中使用。
目前RegisterClass函数已被RegisterClassEx函数做取代。但是,如果不需要设置类小图标,则仍然可以使用RegisterClass。
ATOM RegisterClassExA(
const WNDCLASSEXA *Arg1
);
可以看到RegisterClassEx只有一个参数,为const WNDCLASSEX *类型,为指向WNDCLASSEX 类型的一个指针。
如果函数成功,则返回值是一个类原子,它唯一地标识正在注册的类。如果函数 失败,则返回值为0。
对于被注册的类型为WNDCLASS类型或者WNDCLASSEX类型
最开始的WNDCLASS定义了两种不同版本,第一种是ASCII版本:
typedef struct tagWNDCLASSA {
UINT style ;
WNDPROC lpfnWndProc ;
int cbClsExtra ;
int cbWndExtra ;
HINSTANCE hInstance ;
HICON hIcon ;
HCURSOR hCursor ;
HBRUSH hbrBackground ;
LPCSTR lpszMenuName ;
LPCSTR lpszClassName ; } WNDCLASSA, * PWNDCLASSA,
NEAR * NPWNDCLASSA, FAR * LPWNDCLASSA ;
第二种是UNICODE版本:
typedef struct tagWNDCLASSA {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCSTR lpszMenuName;
LPCSTR lpszClassName;
} WNDCLASSA, *PWNDCLASSA, *NPWNDCLASSA, *LPWNDCLASSA;
目前该结构已经被RegisterClassEx函数使用的WNDCLASSEX结构取代,WNDCLASSEX的结构如下所示:
typedef struct tagWNDCLASSEXA {
UINT cbSize;//该结构的大小 sizeof(WNDCLASSEX) 必须要设置该参数
UINT style;//样式
WNDPROC lpfnWndProc;//窗口过程函数指针
int cbClsExtra;//根据窗口类结构分配的额外字节数 一般为0
int cbWndExtra;//窗口实例后要分配的额外字节数。
HINSTANCE hInstance;//实例句柄
HICON hIcon;//类图标的句柄
HCURSOR hCursor;//类光标的句柄
HBRUSH hbrBackground;//类背景画笔句柄
LPCSTR lpszMenuName;//菜单名称
LPCSTR lpszClassName;//类窗口名称
HICON hIconSm;//类的小图标
} WNDCLASSEXA, *PWNDCLASSEXA, *NPWNDCLASSEXA, *LPWNDCLASSEXA;
在该结构中,最重要的参数为lpfnWndProc和lpszClassName。在第一个例子中,对于WNDCLASSEX进行如下的初始化:
static TCHAR szAppName[] = TEXT("HelloWin");
WNDCLASSEX wndclass; //用描述主窗口的参数填充WNDCLASSEX结构
wndclass.cbSize = sizeof(wndclass); //结构的大小(必须定义结构大小)
wndclass.style = CS_HREDRAW | CS_VREDRAW; //样式
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 = szAppName; //窗口类的名称
wndclass.hIconSm = NULL; //没有类的小图标
可以看出lpfnWndProc中所赋值为窗口过程函数WndProc,这个过程函数将处理依据这个视窗类别建立的所有视窗的全部信息,窗口类名则为szAppName字符串。
当12个参数被填充完成时,就可以使用RegisterClassEx进行注册。
参考资料:
[1]《Windows程序设计(第五版)》
[2]https://docs.microsoft.com/zh-cn/welcome-to-docs