示例验证PostMessage和SendMessage的区别
1个回答
展开全部
首先简单描述一下PostMessage和SendMessage的区别,让大家有个概念。
PostMessage:只是将消息放入到消息队列中,不管是否执行都返回。
SendMessage:将消息放入到消息队列中,并立即执行返回结果。
下面开始做一个基于对话框的MFC示例:
1)创建工程,并在对话框中插入一个STATIC控件,关联变量名m_staticPrompt
2)在对话框头文件中声明函数:
afx_msg LRESULT OnRefreshPrompt(WPARAM wPara,LPARAM lPara);//目的是接受到消息后,进行响应
3)在对话框头文件中定义一个自定义消息宏名称
#define WM_REFRESH WM_USER+1
4)在对话框源文件中添加消息映射
BEGIN_MESSAGE_MAP(CTestPostMsgDlg, CDialog)
...
ON_MESSAGE(WM_REFRESH, &CTestPostMsgDlg::OnRefreshPrompt)
...
END_MESSAGE_MAP()
5)在对话框源文件中写入如下代码:
//执行WM_REFRESH消息响应
LRESULT CTestPostMsgDlg::OnRefreshPrompt(WPARAMwPara,LPARAM lPara)
{
CString* str = (CString*)lPara;
if(str->Compare(_T("POST"))==0)
m_staPrompt.SetWindowText(_T("接受到传递的消息"));
UpdateData(FALSE);
//
return TRUE;
}
//
void CTestPostMsgDlg::OnBnClickedOk()
{
//第一步传递普通的消息看看区别
//如果调试以下两句代码,您会发现:先退出后更新
// PostMessage(WM_REFRESH);
// SendMessage(WM_CLOSE);
//如果调试以下两句代码,您会发现:先更新后退出
// PostMessage(WM_CLOSE);
// SendMessage(WM_REFRESH);
//第二步一个带字符串的消息看看效果
CString* strTemp = new CString("POST");
//如果使用PostMessage传递,您会发现:字符串已经析构了才执行消息响应,这样会造成死机
// PostMessage(WM_REFRESH,0,(LPARAM)strTemp);
//如果使用SendMessage传递,您会发现:显示正常
SendMessage(WM_REFRESH,0,(LPARAM)strTemp);
delete strTemp;
}
PostMessage:只是将消息放入到消息队列中,不管是否执行都返回。
SendMessage:将消息放入到消息队列中,并立即执行返回结果。
下面开始做一个基于对话框的MFC示例:
1)创建工程,并在对话框中插入一个STATIC控件,关联变量名m_staticPrompt
2)在对话框头文件中声明函数:
afx_msg LRESULT OnRefreshPrompt(WPARAM wPara,LPARAM lPara);//目的是接受到消息后,进行响应
3)在对话框头文件中定义一个自定义消息宏名称
#define WM_REFRESH WM_USER+1
4)在对话框源文件中添加消息映射
BEGIN_MESSAGE_MAP(CTestPostMsgDlg, CDialog)
...
ON_MESSAGE(WM_REFRESH, &CTestPostMsgDlg::OnRefreshPrompt)
...
END_MESSAGE_MAP()
5)在对话框源文件中写入如下代码:
//执行WM_REFRESH消息响应
LRESULT CTestPostMsgDlg::OnRefreshPrompt(WPARAMwPara,LPARAM lPara)
{
CString* str = (CString*)lPara;
if(str->Compare(_T("POST"))==0)
m_staPrompt.SetWindowText(_T("接受到传递的消息"));
UpdateData(FALSE);
//
return TRUE;
}
//
void CTestPostMsgDlg::OnBnClickedOk()
{
//第一步传递普通的消息看看区别
//如果调试以下两句代码,您会发现:先退出后更新
// PostMessage(WM_REFRESH);
// SendMessage(WM_CLOSE);
//如果调试以下两句代码,您会发现:先更新后退出
// PostMessage(WM_CLOSE);
// SendMessage(WM_REFRESH);
//第二步一个带字符串的消息看看效果
CString* strTemp = new CString("POST");
//如果使用PostMessage传递,您会发现:字符串已经析构了才执行消息响应,这样会造成死机
// PostMessage(WM_REFRESH,0,(LPARAM)strTemp);
//如果使用SendMessage传递,您会发现:显示正常
SendMessage(WM_REFRESH,0,(LPARAM)strTemp);
delete strTemp;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询