每一个窗口都属于一个窗口类(Window Class)。每一种窗口类具有对固定的用户输入的处理模式,同一类窗口具有相同的菜单项,背景,图标,鼠标指针和窗口消息处理函数。
应用程序在创建窗口前,需要向系统注册窗口类(RegisterClass()),或使用系统已经定义好的窗口类(一些公用的控件所需的窗口类已经由系统定义好了)。在注册窗口类时,需要制定窗口消息的处理函数,比如:WNDCLASSEX mywcex;
mywcex.lpfnWndProc = WndProc; 其中,WndProc() 就是消息处理函数。
Windows API 函数 RegisterClass() 和 RegisterClassEx() 都可以完成窗口类的注册,后者是前者的一个扩展。
WNDCLASSEX 的定义如下:
[C++] 纯文本查看 复制代码 typedef struct {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;
其中 style 是窗口类样式,通过系统预定义的一些常量来设置窗口的样子。比如,CS_BYTEALIGNCLIENT 表示窗口客户区以 byte 的宽度对齐,CS_DBLCLKS 表示如果有双击就会向窗口发送消息,CS_NOCLOSE 表示没有关闭按钮,CS_HREDRAW 和 CS_VREDRAW 表示窗口的长度或宽度在变化后会重绘窗口。
lpfnWndProc 是应用程序的实例句柄,和 WinMain() 函数中的第一个参数一样。
hIcon ,hCursor,hbrBackground,lpszMenuName 分别是窗口类的图标样式,鼠标指针样式,背景画刷(COLOR_BACKGROUND,COLOR_WINDOW等,也可以自定义画刷),菜单名。
lpszClassName 是新建窗口类的类名,在创建窗口时需要制定窗口所属类的类名。
将窗口类中的元素填充完毕后需要注册窗口类,注册窗口类使用 RegisterClass() 或 RegisterClassEx() 函数。下面是一段示例代码:
[C++] 纯文本查看 复制代码 ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX mywcex;
mywcex.cbSize = sizeof(WNDCLASSEX);
mywcex.style = CS_HREDRAW | CS_VREDRAW;
mywcex.lpfnWndProc = WndProc;
mywcex.cbClsExtra = 0;
mywcex.cbWndExtra = 0;
mywcex.hInstance = hInstance;
mywcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
//mywcex.hIcon = LoadIcon(NULL, IDI_ERROR);
mywcex.hCursor = LoadCursor(NULL, IDC_ARROW);
mywcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
mywcex.lpszMenuName = MAKEINTRESOURCE(IDC_WIN32MAIN);
mywcex.lpszClassName = szWindowClass;
mywcex.hIconSm = NULL;//LoadIcon(mywcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&mywcex);
} |