WINCE应用开发笔记四-----消息循环

来源:互联网 发布:中国专利数据库 编辑:程序博客网 时间:2024/05/17 08:26

这似乎是每个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。

 

一个好的教程地址:

http://www.winprog.org/tutorial/message_loop.html