(1)新建一个基于对话框的MFC应用程序MessageTest,删除对话框中原有控件。
注:对话框系统预定义的消息,可以在对话框“属性”里找到“消息”页面,如图所示:
(2)添加2个按钮,设置按钮标题分别为“用SendMessage发送自定义消息”和“用PostMessage发送自定义消息”。
(3)切换到解决方案管理器,打开MessageTestDlg.h文件,在开头添加自定义消息的宏定义:
#define WM_MYMSG WM_USER+101 //定义一个自定义消息
注:WM_USER是系统预定义的宏,这里的101也可以改为其他正整数。
(4)添加消息处理函数,打开MessageTestDlg.h,在类CMessageTestDlg里的DECLARE_MESSAGE_MAP()前面添加一个函数说明:
afx_msg LRESULT OnMyMsg(WPARAM wParam, LPARAM lParam);
注:afx_msg是一个宏,但它是空定义,仅仅表示声明的函数是一个消息响应函数。
打开MessageTestDlg.cpp,在文件末尾添加DoMyMsg函数的实现代码:
LRESULT CMessageTestDlg::OnMyMsg(WPARAM wParam, LPARAM lParam)
{
AfxMessageBox((CString)(char*)wParam);
return 0;
}
注:把收到的字符串显示出来。类型转换,先转换成char*,再转换成CString类型。
再在END_MESSAGE_MAP()上面添加一行:
ON_MESSAGE(WM_MYMSG, OnMyMsg)
注:ON_MESSAGE是处理自定义消息的宏,把定义的消息WM_MYMSG和定义的消息处理函数OnMyMsg关联起来。
(5)发送消息,双击“用SendMessage发送自定义消息”按钮,添加代码如下:
void CMessageTestDlg::OnBnClickedButton1() //SendMessage方式
{
// TODO: 在此添加控件通知处理程序代码
char szText[] = "Visual C++ 2010开发工具";
SendMessage(WM_MYMSG, (UINT)szText, 0);
}
再为另外一个按钮添加处理函数,代码如下:
void CMessageTestDlg::OnBnClickedButton2() //PostMessage方式
{
// TODO: 在此添加控件通知处理程序代码
char szText[] = "Microsoft Visual Studio 2010开发工具";
PostMessage(WM_MYMSG, (UINT)szText, 0);
}
(6)保存工程并运行,分别单击2个按钮,结果如下图所示:
发现SendMessage发出消息后弹出的消息框上的字符串就是参数里面所传的,而PostMessage发出消息后弹出的消息框上为空。这是因为szText是局部变量,它所拥有的字符串在函数OnBnClickedButton1或OnBnClickedButton2执行完毕后会自动释放,即PostMessage发出消息后立即返回,OnBnClickedButton2马上执行完毕导致OnBnClickedButton2中szText马上释放了。SendMessage会等到消息处理函数执行完毕后才返回。