[Windows编程]父对话框与非模态子对话框的消息通信

来源:互联网 发布:linux常用浏览器 编辑:程序博客网 时间:2024/06/08 09:37

父对话框类:Cwhu_VoiceCardDlg

子对话框类:Cwhu_FaxDlg

第一节:父对话框向子对话框传递消息

Step1: 定义消息

在 父对话框类的头文件"whu_VoiceCardDlg.h"#define  WM_UPATEDATA WM_USER+20 ,父对话框发出WM_UPATEDATA 消息,子对话框接收并相应。


Step2:定义消息响应函数

在子对话框头文件Cwhu_FaxDlg.h中声明:

afx_msg LRESULT OnUpdateData(WPARAM wParam, LPARAM lParam);

然后在Cwhu_FaxDlg.cpp文件包含whu_VoiceCardDlg.h

(注意,是在Cwhu_FaxDlg.cpp中,不是在Cwhu_FaxDlg.h中,不然头文件重复编译,会报错syntax error : missing ';' before '*'

然后定义:

LRESULT Cwhu_FaxDlg::OnUpdateData(WPARAM wParam, LPARAM lParam)
{
int* m_FaxState = (int*)lParam;
whu_ShowFaxState(*m_FaxState);
UpdateData(FALSE);
return true;
}

然后在Cwhu_FaxDlg.cpp文件的BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间添加

ON_MESSAGE(WM_UPATEDATA, OnUpdateData),效果如下所示:


BEGIN_MESSAGE_MAP(Cwhu_FaxDlg, CDialogEx)
ON_MESSAGE(WM_UPATEDATA, OnUpdateData)
END_MESSAGE_MAP() 

(备注:我发现我的Cwhu_FaxDlg.cpp中有两个BEGIN_MESSAGE_MAPEND_MESSAGE_MAP,只有将ON_MESSAGE(WM_UPATEDATA, OnUpdateData)放在定义很多消息函数的地方才可以,不然报错)

Step3:父对话框发出消息

int whu_FaxSendState = FAX_NOANSWER;

m_DlgFax->PostMessage(WM_UPATEDATA, 0, (LPARAM)&whu_FaxSendState);

其中,m_DlgFax为在"whu_VoiceCardDlg.h"定义的Cwhu_VoiceCardDlg的成员函数:Cwhu_FaxDlg *m_DlgFax;


第二节:子对话框向父对话框传递信息

方法一:使用父对话框的指针

在子对话框类中定义成员变量:CDialog * whu_ParentDlg;
父对话框初始化子对话框的时候,对子对话框的whu_ParentDlg赋值,具体如下:
m_DlgFax = new Cwhu_FaxDlg();
m_DlgFax->whu_ParentDlg = this;
m_DlgFax->Create(IDD_FAX,this);
m_DlgFax->ShowWindow(SW_SHOW);

然后,在子对话框里面,可以通过((Cwhu_VoiceCardDlg*)whu_ParentDlg)->XXXX的形式调用父对话框的公有变量/函数。

方法二:使用消息机制

原理类似上面。


原创粉丝点击