消息机制要点
窗口过程
每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗
口句柄(Window Handle),消息 ID(Message ID),和两个消息参数(wParam, lParam),
当窗口收到消息时系统就会调用此窗口过程来处理消息。(所以叫回调函数)
消息类型
1) 系统定义消息(System-Dened Messages)
在 SDK 中事先定义好的消息,非用户定义的,其范围在[0x0000, 0x03$]之间, 可以分
为以下三类:
1> 窗口消息(Windows Message)
与窗口的内部运作有关,如创建窗口,绘制窗口,销毁窗口等。可以是一般的窗口,也可
以是 Dialog,控件等。
如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR,
WM_HSCROLL...
2> 命令消息(Command Message)
与处理用户请求有关, 如单击菜单项或工具栏或控件时, 就会产生命令消息。
WM_COMMAND, LOWORD(wParam)表示菜单项,工具栏按钮或控件的 ID。如果是控
件, HIWORD(wParam)表示控件消息类型
3> 控件通知(Notify Message)
控件通知消息, 这是最灵活的消息格式, 其 Message, wParam, lParam 分别为:
WM_NOTIFY, 控件 ID,指向 NMHDR 的指针。NMHDR 包含控件通知的内容, 可以任意
扩展。
2) 程序定义消息(Application-Dened Messages)
用户自定义的消息, 对于其范围有如下规定:
WM_USER: 0x0400-0x7FFF (ex. WM_USER+10)
WM_APP(winver> 4.0): 0x8000-0xBFFF (ex.WM_APP+4)
RegisterWindowMessage: 0xC000-0xFFFF
消息队列
Windows 中有两种类型的消息队列
1) 系统消息队列(System Message Queue)
这是一个系统唯一的 Queue,设备驱动(mouse, keyboard)会把操作输入转化成消息存
在系统队列中,然后系统会把此消息放到目标窗口所在的线程的消息队列(thread-
specic message queue)中等待处理
2) 线程消息队列(Thread-specic Message Queue)
每一个 GUI 线程都会维护这样一个线程消息队列。(这个队列只有在线程调用 GDI 函数时
才会创建,默认不创建)。然后线程消息队列中的消息会被送到相应的窗口过程
(WndProc)处理.
注意: 线程消息队列中 WM_PAINT,WM_TIMER 只有在 Queue 中没有其他消息的时候
才会被处理,WM_PAINT 消息还会被合并以提高效率。其他所有消息以先进先出
(FIFO)的方式被处理。
队列消息和非队列消息
1)队列消息(Queued Messages)