1.Windows消息机制
Windows应用程序是通过消息驱动的,在MFC软件开发时,进行界面操作经常要用到消息,通过消息对应的处理函数来实现响应的操作。比如,用户操作窗口,就会产生消息,送给对应的消息处理函数进行处理,对用户的操作做出一些反应。
2.MFC消息映射
MFC使用消息映射机制来处理消息,具体表现就是消息和消息处理函数一一对应的消息映射表,以及消息处理函数的声明和是实现。当窗口收到消息时,会在消息映射表中寻找对应的处理函数,然后由消息处理函数做出相应的处理。
3.自定义消息的方法
MFC无法通过类向导自定义消息,所以需要手动进行添加,主要过程如下:
- 定义消息:因为很多新控件也会用到WM_USER消息,所以自定义需要从WM_USER+100开始或更高,以避免冲突。
#define WM_MY_MESSAGE (WM_USER+100)
- 声明消息处理函数:afx_msg为消息标志,它向系统声明,有消息映射到函数实现体。
afx_msg LRESULT OnGlobalRegisterReadRspMsg(WPARAM wParam, LPARAM lParam);
- 实现消息处理函数
- 将消息映射到消息处理函数:MESSAGE_MAP即是消息映射表
BEGIN_MESSAGE_MAP()
ON_MESSAGE(WM_MY_MESSAGE, &MY_CLASS::OnGlobalRegisterReadRspMsg)
END_MESSAGE_MAP()
- 发送自定义消息:在发送自定义消息时,通常使用PostMessage和SendMessage的用法
::PostMessage(m_hWnd, WM_MY_MESSAGE, wParam , lParam);
4.PostMessage和SendMessage
4.1 SendMessage函数
LRESULT SendMessage (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
4.2 PostMessage函数
BOOL PostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
4.3 WPARAM和LPARAM参数
这两个参数指定了与消息有关的附加信息,是Windows消息机制的两个重要参数,整个Windows依靠这两个参数传递各种各样的消息。
- WPARAM:它表示此次的消息类型是什么,是鼠标?是键盘?键盘up还是down?鼠标单击or双击等等。(我们也可以自定义值来表示我们想要传递的消息的含义)
- LPARAM:它是一个指针,它指向本条区域所存储的信息的内存区域的首地址(一般用来携带数据)
4.4 二者的区别:
PostMessage是异步的,SendMessage是同步的。PostMessage 只把消息放入队列,不管消息是否被处理就返回,消息可能不被处理;而 SendMessage 等待消息被处理完了之后才返回,如果消息不被处理,发送消息的线程将一直被阻塞。也就是说,SendMessage发送消息不经过消息队列,会被直接处理,但是SendMessage会一直等待,直到消息被处理才会返回
4.5 二者的相同点:
都可以向进程内窗口发送消息,也可以向进程外窗口发送消息。