背景:
应用程序以对话框进行编程,会出现一个主对话框界面,在主对话框中会出现不同的模态对话框。这时子对话框向主界面对话框的消息传递就成为该设计的关键。
方法:
1、 在子对话框类定义时,传递主对话框指针;
2、 通过主对话框指针获取主对话框变量,及发送消息。
详细代码:
子对话框文件:MaxDisplayDlg.h中
class SystemDlg; //声明使用主对话框类
//CMaxDisplayDlg dialog
class CMaxDisplayDlg : publicCDialogEx
{
DECLARE_DYNAMIC(CMaxDisplayDlg)
public:
CMaxDisplayDlg(CCapsuleTestSystemDlg*pMain,CWnd* pParent=NULL); // standard constructor
virtual~CMaxDisplayDlg();
//Dialog Data
enum {IDD = IDD_DISPLAY };
protected:
virtualvoid DoDataExchange(CDataExchange* pDX); // DDX/DDVsupport
DECLARE_MESSAGE_MAP()
public:
afx_msg voidOnBnClickedDisexit();
intm_radCamera;
virtualBOOL OnInitDialog();
afx_msg voidOnBnClickedButton1();
private:
CCapsuleTestSystemDlg* m_pMainDlg; //定义成员变量,用于保存主对话框指针
};
子对话框文件:MaxDisplayDlg.cpp中
#include "SystemDlg.h" //必须包含主对话框头文件
//默认构造函数更改如下:
CMaxDisplayDlg::CMaxDisplayDlg(CCapsuleTestSystemDlg*pMain,CWnd* pParent/*=NULL*/)
: CDialogEx(CMaxDisplayDlg::IDD,pParent)
, m_radCamera(0)
{
ASSERT(pMain);
m_pMainDlg=pMain;
}
void CMaxDisplayDlg::OnBnClickedButton1()
{
m_pMainDlg->SendMessage(UM_SINGLEDRABB,0,0);//如此发送消息
}
在主对话框类SystemDlg.cpp中
在某个按钮单击函数中,定义子对话框,并显示模态。
void SystemDlg::OnBnClickedDisplay()
{
// TODO: Addyour control notification handler code here
CMaxDisplayDlg cameradis(this);
cameradis.DoModal();
}
方法二:通过获得主对话框的句柄来传递消息.
在主对话框的成员类中头文件中定义:
HWND m_hmaindlg; //主对话框句柄
在主对话框的成员类的OnInitDialog()函数中添加:m_hmaindlg=AfxGetApp()->GetMainWnd()->GetSafeHwnd();
在stdafx.h中定义自定义消息:#define UM_CAMERASETCHANGE (WM_USER+120)
通过主对话框的class Wizard...在主对话框中添加自定义消息UM_CAMERASETCHANGE
在主对话框的成员类需要发送消息的地方:::PostMessage(m_hmaindlg,UM_CAMERASETCHANGE,0,0); //发送数据更新消息