首先弄清楚两点:
(1)谁要发送这个消息(2)谁要接受这个消息。
用一个简单的例子来说明。对象A向B(也可以就是A到A)发送消息。
1 发送消息
首先在A的头文件中定义这个消息:
注意:实际中在stdafx.h中可以定义一下,这个宏需要在A、B中都用到
#define WM_USERMESSAGE WM_USER+30
所有自定义消息都是以WM_USER消息为基础加上一个任意的自然数来表示的。A是向外发送消息的对象,因此在A的某个方法(函数)里就会调用用来发消 息的函数B::SendMessage()/B::PostMessage(),因为是B接受消息,因此是如上的形式。
2 接受消息
对象接受一个消息,应该有三部分:在头文件中有该消息的处理函数的原型;在实现文件中有接受消息映射的宏; 以及该消息的处理函数的具体实现。
此后可以对线程对话框中利用类向导,添加自定义消息:
会确定消息名WM_USERMESSAGE已经消息响应函数,之后在函数中响应消息即可,函数的参数需要和SendMessage()/B::PostMessage()输入一直:
WPARAM wParam,LPARAM lParam
实例(其他线程调用某线程对话框的更新函数)如下:
另外一种是通过发消息的方法转到UI线程去处理.可以在窗口映射一个消息,比如ON_MESSAGE(WM_UPDATEDATA,OnUpdateData),
然后其他线程可以用SendMessage(WM_UPDATEDATA,FALSE)传消息给窗口,窗口的消息处理肯定是在UI线程里面,这时候可以用
LRESULTCProtectPage::OnUpdateData(WPARAMwParam,LPARAMlParam)
{
UpdateData(wParam);
return0;
} 2.1 头文件中加上自定义消息的处理函数原型
在DECLARE_MESSAGE_MAP()语句之前,一对AFX_MSG之间加上如下形式的函数原型:
afx_msg LRESULT OnProcName( WPARAM wParam, LPARAMlParam );
对Win32来说,wParam, lParam是传递消息最常用的手段。
2.2 在实现文件中加上接受消息映射的宏
在cpp文件里,BEGIN_MESSAGE_MAP语句之后,在一对AFX_MSG_MAP之间,增加 如下形式的代码:
ON_MESSAGE(WM_USERMESSAGE, OnProcName)
上面是不用分号结尾的。
2.3 在实现文件中给出消息处理函数的具体实现。
本文介绍了C++中自定义消息的方法,包括如何发送和接收消息。在发送消息时,通常基于WM_USER消息并定义一个自然数作为标识。发送方调用接收方的SendMessage或PostMessage函数。接收消息则需要在头文件声明处理函数,实现文件中添加消息映射,并在窗口映射消息以确保在UI线程中处理。

598

被折叠的 条评论
为什么被折叠?



