这似乎是每个Windows应用开发者都要搞清楚的事情,就是消息循环机制。
在进程启动后,用LoadString导入两个字符串资源,Title和WindowClass的名称。每一个进程都有一个Top-Level Window,这个Title和WindowsClass就是描述这个Top-Level Window的。然后,用FindWindow根据这两个字符串查找Window,如果这个Window存在,则用SetForgroundWindow激活它,并退出。如果不存在,则创建它。
首先要填充WndClass结构,包括window class name,wndProc,inst。需要注意的是,在WinCE中,hCursor,除非添加了这个组件,否则,不要设置它;在Wince中,hMenu也不要设置,因为不支持。再用CreateWindow创建并返回窗口句柄,最后是GetMessage、TranslateMessage和DispatchMessage的循环体。
Windows的程序是事件驱动的,有一个Message Queue,来了Message都是先放在这个Queue中,然后用GetMessage的循环体处理。
MSDN中说明message Queue是属于call thread的,但我目前想不出在一个程序中有存在多个这样的message Queue的必要性,可以认为,一个程序一个message Queue。
GetMessage从messageQueue中取出消息,返回的是一个MSG的结构体。这个结构体中有几项:
1. hWnd:发给哪个窗口;
2. messageID
3. wParam、lParam
4. time:消息产生时间
5. pt:产生消息时光标所在位置。
有一个PeekMessage和GetMessage的功能类似,不同在于,当message Queue中没有message时,GetMessage会阻塞,而PeekMessage会立即返回。
DispatchMessage处理Msg。在RegisterClass和CreateWindow时,建立了WndProc到WindowClass到hWnd的联系,因此,可以根据hWnd可以找到WndProc。WndProc是一个回调函数,被DispatchMessage调用。以下两段代码功能上基本上是等价的:
在WndProc中的第一个参数是hWnd,这是因为,一个WndProc可以对应多个窗口句柄。
那么,以下这种做法是否正确?
错误!因为,除了WndProc之外,系统还做了一些其它的事情。这在MSDN中对于WM_CREATE的描述中有说明:
If an application processes this message, it should return 0 to continue creation of the window
即,在WndProc中,只做了一些custom的东西。
在下一篇中,将结合WM_TIMER说明DispatchMessage。
一个好的教程地址: