接触VC之一:WinSDK
2006-07-19 11:36:55 来源:WEB开发网style 指定窗口风格,譬如例子所举的CS_HREDRAW表示当水平长度发生改变时,重画整个窗口。 LpfnWndProc 指定窗口的消息处理函数,其函数的原型必须是
LRESULT CALLBACK WndProcName(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
WndProcName这一名字是随便起的.
hInstance 标识该窗口属于哪个程序实例.
hIcon 标识该窗口图标的图标句柄
hCurosr 标识该窗口光标的光标句柄
hbrBackground 标识该窗口的背景画笔.
lpszClassName 为这个窗口类所起的名字,为后来建立窗口引用窗口类所用。
当注册窗口类成功后就可以建立窗口了。主函数调用InitInstance()来建立窗口.在InitInstance()函数中使用CreateWindow();来建立窗口,其中第一个参数就是窗口类的名称,则注册窗口类时lpszClassName字段中的内容。如果成功则返回句柄,句柄代表刚刚建立好的窗口(实例)。否则的话返回的句柄为空。当建立好窗口的并不立即显示,还需用ShowWindow来使系统显示窗口,其参数就是一个窗口句柄(HWND)。看吧,在WinSDK中都是句柄来标识任何东西的(程序,窗口,图标,光标,文件等等)。然后再使用UpdateWindow()让窗口在屏幕上重绘一遍,使其真正显示出来。最后返回true.
接着就是WinSDK中重要一节消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage (&msg);
}
在每个程序实例中系统都会给配置了一个消息队列,当消息产生后(譬如:刷新WM_PAINT,鼠标移动WM_MOSEMVOE,键盘某个键被按下WM_KEYDOWN等等),就会将其放入队列尾部。程序这里用了一个while循环,这就是著名的消息循环了。GetMessage()在队列头部取出一条消息放入第一参数msg中,如果不是WM_QUIT (退出程序消息)消息则返回true,如果是WM_QUIT则返回false,结束循环。循环中第一个函数TranslateMessage()是键盘转换函数,其功能是将虚拟键消息转换成字符消息:
*WM_KEYDOWN/WM_KEYUP组合成一个WM_CHAR或WM_DEADCHAR消息
*WM_SYSKEYDOWN/WM_SYSKEYUP组合成一个WM_SYSCHAR或WM_SYSDEADCHAR消息。
并将组合成的消息放到队列当中去,等以后处理。
DispatchMessage()函数是将消息传送给相应的窗口消息处理函数中去。在MSG结构中有一个HWND字段它记录着产生消息的窗口,DispatchMessage会查找这个HWND句柄属于哪个窗口类,并将消息传入这个窗口类所联系的消息处理函数(在WNDCLASS结构中LpfnWndProc字段所指向的函数)中去。这样它就完成了它的消息分配工作。在上面示例程序中,只注册了一个窗口类。所以所有消息都是由这个窗口类的窗口实例所产生的,因此所有的消息都会被传入WinProc中去了。
在消息处理函数的入口参数中,是标识一条消息的主要信息,hWnd发生消息的源窗口,message消息的类型表示发生了什么消息,wParam,lParam与消息捆绑来的信息。因为在C\C++中类型是可以自由转换的,所以根据不同消息,其里面的内容是不一致。在消息处理函数中一般上是用switch/case语句来实现不同消息不同处理的。相信大家一看就明白怎么回事了。
关于message中的信息在VC98\Include\WinUSER.h(参考行数1292)中有详细的定义,各个消息的涵义可在MSDN中查到。
以上,就是我所知道的WinSDK所有东西。如果有什么错误和遗漏之处,请写信给我:Blue_Atlantis400@Hotmail.com;QQ:63068279。
(第一部分完)
更多精彩
赞助商链接