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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值