应该结合(002)中的程序例子好好地理解,有十分大的帮助.
链接:WINDOWS程序设计(002)—-HELLOWIN程序(源代码及详细解析)
WINDOWS程序原理
1.WNDCLASS类型结构的定义
在WinMain中,我们通常用如下形式定义一个WNDCLASS类型的结构.(定义方式参考后面的附表)
然后对该结构的10个字段进行初始化,并调用RegisterClass函数.
在WNDCLASS结构中,两个最重要的字段是第二个字段和最后一个字段.
第二个字段(lpfnWndProc)是用于基于该窗口类的所有窗口过程的地址.在HELLOWIN中,该窗口过程就是WndProc.
最后一个字段是窗口类的名称,允许用户任意命名.当程序只创建一个窗口时,窗口类的名称通常与程序名相同.
另外几个字段描述了窗口类的其他一些特性.下面考察WNDCLASS结构的每个字段.
(1) style
以下语句用C语言的按位亦或运算符,组合了两个32位的”类风格”(class style)的标识符:
在头文件WINUSER.H中,所有前缀为CS的标识符定义如下:
这种方式定义的标识符常常被称为”位标记“(bit flag),因为每个标识符都只能影响复合值的一位.在这些类风格中,只有少数会被经常使用.程序HELLOWIN使用了两个标识符,以指定无论何时窗口的水平尺寸(CS_HREDRAW)或垂直尺寸(CS_VREDRAW)被改变,所有基于该窗口类的窗口都将被重新绘制.在调整HELLOWIN的窗口尺寸时,可以发现,文本字符串被重新绘制在窗口新的中心位置上.真是这两个标识符确保了这种结果.稍后我们将了解窗口尺寸的变化是如何通知给窗口过程的.
(2) lpfnWndProc
对于WNDCLASS结构中的第二个字段,初始化语句如下:
该语句将该窗口的窗口过程设为WndProc函数,即HELLOWIN.C中的第二个函数.这个函数将处理传递给所有的基于该窗口类创建的窗口的所有消息.在C语言中,当在语句中按这种方式使用函数名时,我们引用的实际上是指向函数的指针.
(3&4) cbClsExtra & cbWndExtra
下面两个字段用于在类结构和Windows内部维护的窗口结构中预留一些额外的空间:
应用程序可以根据需要来使用这些额外的空间.HELLOWIN中没有用到这个特性,因此将这两个参数覆位0.否则,正如匈牙利标记法所表示的,这些字段可以被设为一个”字节数”.
(5) hInstance
接下来的字段表示应用程序的实例句柄(是WinMain的一个参数):
(6) hIcon
下面的语句为所有的基于该窗口类的窗口设定一个图标:
IDI表示”图标的标识符”(ID for an icon).
HICON,表示”图标的句柄”(handle to an icon).
(7) hCursor
LoadCursor函数载入一个预定义的鼠标指针(称为IDC_ARROW),并返回指针的句柄.该句柄被用来设定WNDCLASS结构的hCursor字段.当鼠标指针出现在这类窗口的客户区内时,将变成一个小箭头.
(8) hbrBackground
下一个字段为窗口的客户区指定了背景色.字段名hbrBackground的前缀hbr表示”画刷的句柄”(handle to a
brush).画刷是一个图形学术语,表示用于区域填充的像素着色模式.Windows有几个标准的画刷,又称为”库存”画刷.下面对GetStockObject的调用返回一个白色画刷的句柄:
这意味着窗口客户区的背景将被填充为白色.
(9) lpszMenuName
接下来一个字段指定了窗口类的菜单.由于HELLOWIN不带任何菜单,所以该字段被设为NULL:
(10) lpszClassName
最后,必须为窗口类赋予一个名称.对于一个小程序来说,这个名称可以简单地利用程序名表示,如保存在变量szAppName中的字符串”HelloWin”:
这个字符串既可以由ASCII字符组成,也可以由Unicode字符组成,美文的英文具体取决于UNICODE标识符是否已经被定义.
当WNDCLASS结构的所有10个字段完成初始化之后,程序HELLOWIN调用函数RegisterClass来完成该窗口类的注册.该函数的唯一参数就是一个指向WNDCLASS结构的指针.
2.附表
ASCII版本的WNDSLASSA:
该结构的Unicode版本定义如下:
头文件WINUSER.H在定义了WNDCLASSA和WNDCLASSW结构之后(另外还定义了指向这些结构的指针),又基于UNICODE标识符的定义定义了WNDCLASS结构和指向WNDCLASS结构的指针(将一些指针包含进来,目的是保持向后的兼容性):
书中的原话:
在本书中,当我介绍后续结构时,将只给出这些结构在功能上等效的定义,例如对WNDCLASS来说.其等效的定义如下:
同时,我也放宽了各种指针的定义.相信你也绝对不会在代码中乱堆一些LP和NP为首的变量类型.
《Windows程序设计 第五版 珍藏版》