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
- WINCE应用开发笔记四-----消息循环
- WINCE应用开发笔记四--COM
- WINCE应用开发笔记二
- zz--WINCE TCPMP应用四:利用TCPMP插件开发程序
- WINCE TCPMP应用四:利用TCPMP插件开发程序
- WINCE TCPMP应用四:利用TCPMP插件开发程序
- WINCE TCPMP应用四:利用TCPMP插件开发程序
- wince驱动开发四
- wince应用开发笔记1-配置输出调试器
- 【Android 开发】: Android 消息处理机制之四: Android 消息循环 Looper 及其源码解析
- 【Android 开发】: Android 消息处理机制之四: Android 消息循环 Looper 及其源码解析
- 【Android 开发】: Android 消息处理机制之四: Android 消息循环 Looper 及其源码解析
- windows应用开发由浅入深(四)创建热键消息
- Android开发笔记(一百零四)消息推送SDK
- WINCE蓝牙应用开发方式
- Android应用开发学习笔记之Toast消息提示框
- wince驱动开发学习笔记
- wince驱动开发学习笔记
- .net 中使用Response.Redirect 在新页面打开
- 客开如何扩展单据体行的双击事件?
- 跨线程调用:Cross Thead Calls are not safe
- Hibernate3.2的annotation的实例
- 用Spring更好地处理Struts动作三种整合
- WINCE应用开发笔记四-----消息循环
- Spring安全权限管理(Spring Security的配置使用)
- 如何让你的SQL运行得更快(转贴)
- ExcelWriter
- VC编程常见错误及调试技巧(部分转自网络)
- 国家自然基金标书申报体会
- flex中拖曳组件的几个属性
- STL函数
- 面试70问 经典回答