- windows平台下,什么是消息?
- 当系统通知窗口工作时,就采用消息的方式派发给窗口的窗口处理函数
- 消息组成的6大部件组合,缺一不可:
- 1 窗口句柄
- 每个win32的窗口程序,只要是有窗口,就不可能没有窗口句柄,因为创建之初就生成了句柄,有如小车要上路就强制要求有个“车牌”。
- 2 消息ID
- 微软给windows消息机制,设计1024个消息数字,这种数字的出现,就代表此种消息的出现。
- 3 消息的两个参数(附带信息)
- 任何一个消息都附带两个信息: 1 不同的消息,这两个附带的信息是不同的 2 一个用WPARAM 保存 ,另外一个用 LPARAM类型来保存。
- 4 消息产生的时间 (不关注,但不可缺少)
- 5 消息产生时的鼠标位置 (不关注,但不可缺少)
- 消息相关函数
- 1 GetMessage - 获取本进程的消息
BOOL GetMessage(
LPMSG lpMsg, //存放获取到的消息Buff
HWND hWnd, //窗口句柄
UINT wMsgFilterMin, //获取消息的最小ID 默认0
UINT wMsgFilterMax //获取消息的最大ID 默认0
);
- LPMSG
lpMsg, - 当获得消息后,将消息的参数存放到MSG结构中。 - HWND
hWnd, - 获得hWnd所指定窗口的消息。 - UNIT
wMsgFilterMin 和 UNIT
wMsgFilterMax - 只能获得由它们指定的消息范围内的消息,如果都为0,表示没有范围。 - BOOL
GetMessage(...) 这个函数的返回值非常重要 - while(GetMessage(...)){......} 返回0才能结束,然而能使得GetMessage函数返回0的消息只有一个:WM_QUIT 。
- PostQuitMessage(0); 预设了一个WM_QUIT消息。##助记:挖坑埋雷
- 2
TranslateMessage - 翻译消息。将探寻消息,翻译成字符消息。BOOL TranslateMessage(
const MSG* lpMsg //要翻译的消息地址
);
- 检查消息是不是按键的消息,不是按键消息,不做任何处理,继续执行。
- 3
DispatchMessage - 派发消息。LONG DispatchMessage(
const MSG* lpmsg
);
- DispatchMessage(&msg,NULL,NULL,NULL)函数派发消息,触发窗口处理函数,调用窗口处理函数。
- msg.hWnd
--> 找到保存窗口数据的内存 ---> 比对"窗口名称"--->匹配窗口类
---> 调用WndProc(msg.hWnd,
msg.message, msg,wParam, msg.lParam); --->给了我们处理消息的机会,我们只处理我们关注的消息,其余的消息,让系统默认的函数DefWindowProc()处理。
时间: 2024-12-14 18:44:47