vc++ 不同对话框中传递信息的方法(基于自定义消息SendMessage) (转载)
2014-07-18 01:05
489 查看
转载自:http://blog.csdn.net/myj0513/article/details/6827360
背景: 新建了一个基于对话框的MFC程序,在主对话框中添加tabcontrol控件,又新建了两个Dialog(CDialog1和CDialog2),将它们设为tabcontrol控件的子对话框。
目的: 两个子对话框之间传递消息,子对话框与主对话框传递消息。
方法: 第一步: 定义消息.
在目标窗口类的头文件或者stdafx.h中添加:
#define WM_MY_MESSAGE
(WM_USER+100);
推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。
第二步:
在目标类头文件的AFX_MSG块中说明消息处理函数: afx_msg LRESULT
OnMyMessage(WPARAM wParam, LPARAM lParam);
[cpp] view
plaincopyprint?
class CDialog1:public CDialog
{
...
// 一般消息映射函数
protected:
// {{AFX_MSG(CDialog)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
}
第三步:在目标类源文件cpp中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。
[cpp] view
plaincopyprint?
BEGIN_MESSAGE_MAP(CDialog1, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
第四步:
实现消息处理函数。
在目标类源文件cpp中,该函数使用WPRAM和LPARAM参数并返回LPESULT。
[cpp] view
plaincopyprint?
LPESULT CDialog1::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 处理用户自定义消息
//MessageBox("消息传递完成!");
return 0;
}
第五步:发送消息时,在源地址类CDialog2的CPP文件中(如一个Button),调用函数PostMessage或SendMessa
ge发送消息。PoseMessage(WM_MY_MESSAGE,O,O);
SendMessage(WM_MY_MESSAGE,O,O);
此时需要注意::::
假如主对话框的类名:CSecondShimDlg,两个子对话框的类名CDialog1和CDialog2;
. 要实现两个子对话框之间进行通信(CDialog2向CDialog1发送消息,目标类即为CDialog1),则在CDialog2源文件中的发送函数应该这么写:
[cpp] view
plaincopyprint?
CSecondShimDlg * m_Host = (CSecondShimDlg*)AfxGetMainWnd();
m_Host->m_Diag1.SendMessage(WM_MY_MESSAGE , wparam, lparam);//这里要注意是m_Diag1,它是在主对话框类中定义的一个CDialog1对象,即目标对象。
要实现CDialog2向主对话框CSecondShimDlg发送消息(目标类即为CSecondShimDlg),则:
[cpp] view
plaincopyprint?
CSecondShimDlg * m_Host = (CSecondShimDlg*)AfxGetMainWnd();
m_Host->SendMessage(WM_MY_MESSAGE , wparam, lparam);
或者:
[cpp] view
plaincopyprint?
::SendMessage(this->GetParent()->GetParent()->m_hWnd, WM_MY_MESSAGE ,wparam, lparam);
// SendMessage函数的第一个参数是目标窗口的句柄。之所以要用两个GetParent()因为Dialog2的父对话框为TabControl,TabControl的父对话框为主对话框CSecondShimDlg
背景: 新建了一个基于对话框的MFC程序,在主对话框中添加tabcontrol控件,又新建了两个Dialog(CDialog1和CDialog2),将它们设为tabcontrol控件的子对话框。
目的: 两个子对话框之间传递消息,子对话框与主对话框传递消息。
方法: 第一步: 定义消息.
在目标窗口类的头文件或者stdafx.h中添加:
#define WM_MY_MESSAGE
(WM_USER+100);
推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。
第二步:
在目标类头文件的AFX_MSG块中说明消息处理函数: afx_msg LRESULT
OnMyMessage(WPARAM wParam, LPARAM lParam);
[cpp] view
plaincopyprint?
class CDialog1:public CDialog
{
...
// 一般消息映射函数
protected:
// {{AFX_MSG(CDialog)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
}
第三步:在目标类源文件cpp中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。
[cpp] view
plaincopyprint?
BEGIN_MESSAGE_MAP(CDialog1, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
第四步:
实现消息处理函数。
在目标类源文件cpp中,该函数使用WPRAM和LPARAM参数并返回LPESULT。
[cpp] view
plaincopyprint?
LPESULT CDialog1::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 处理用户自定义消息
//MessageBox("消息传递完成!");
return 0;
}
第五步:发送消息时,在源地址类CDialog2的CPP文件中(如一个Button),调用函数PostMessage或SendMessa
ge发送消息。PoseMessage(WM_MY_MESSAGE,O,O);
SendMessage(WM_MY_MESSAGE,O,O);
此时需要注意::::
假如主对话框的类名:CSecondShimDlg,两个子对话框的类名CDialog1和CDialog2;
. 要实现两个子对话框之间进行通信(CDialog2向CDialog1发送消息,目标类即为CDialog1),则在CDialog2源文件中的发送函数应该这么写:
[cpp] view
plaincopyprint?
CSecondShimDlg * m_Host = (CSecondShimDlg*)AfxGetMainWnd();
m_Host->m_Diag1.SendMessage(WM_MY_MESSAGE , wparam, lparam);//这里要注意是m_Diag1,它是在主对话框类中定义的一个CDialog1对象,即目标对象。
要实现CDialog2向主对话框CSecondShimDlg发送消息(目标类即为CSecondShimDlg),则:
[cpp] view
plaincopyprint?
CSecondShimDlg * m_Host = (CSecondShimDlg*)AfxGetMainWnd();
m_Host->SendMessage(WM_MY_MESSAGE , wparam, lparam);
或者:
[cpp] view
plaincopyprint?
::SendMessage(this->GetParent()->GetParent()->m_hWnd, WM_MY_MESSAGE ,wparam, lparam);
// SendMessage函数的第一个参数是目标窗口的句柄。之所以要用两个GetParent()因为Dialog2的父对话框为TabControl,TabControl的父对话框为主对话框CSecondShimDlg
相关文章推荐
- vc++ 不同对话框中传递信息的方法(基于自定义消息SendMessage)
- vc++ 不同对话框中传递信息的方法(基于自定义消息SendMessage)
- vc中使用SendMessage正确发送自定义消息的方法
- vc中用SendMessage自定义消息传递
- vc中使用SendMessage正确发送自定义消息的方法
- vc中使用SendMessage正确发送自定义消息的方法
- VC对话框项目-自定义消息的方法
- vc中使用SendMessage正确发送自定义消息的方法
- 【转】vc中使用SendMessage正确发送自定义消息的方法--不错
- 转载VC中SendMessage和PostMessage发送消息(不同进程复杂参数传递)
- [VC]SendMessage和PostMessage发送消息(不同进程传递字符串)
- MFC中不同对话框间使用SendMessage发送自定义消息的具体实现
- vc中怎么使用SendMessage自定义消息函数
- vc自定义消息的发送与接收的方法实现
- vc中使用SendMessage正确发送自定义消息
- vc自定义消息的发送与接收的方法实现
- 【转载】基于VC++的特殊波特率的实现方法
- VC自定义消息的发送与接收的方法实现
- 关于VC++中,两种自定义消息的发送与接收的方法实现进行说明。
- vc自定义消息的发送与接收的方法实现