1. 前期工作
有两个对话框,并且放好了编辑框和按钮,我的是这样:
主对话框Ccpp7103Dlg:
子对话框CTestDIg:
其中在主对话框中点击OpenDlg按钮可以打开子对话框,只要两个对话框有读取数据的编辑框和发送消息框就满足示例的条件。
2. 实现从主对话框发送到子对话框
PostMessage和SendMessage步骤都是一样的,个别不同的在最后一点声明
我们首先在主对话框cpp文件cpp7103Dlg.cpp中开头定义一个消息标识:
#define WM_MSG (WM_USER+1)
#include "pch.h"
#include "framework.h"
#include "cpp7103.h"
#include "cpp7103Dlg.h"
#include "afxdialogex.h"
#define WM_MSG (WM_USER+1)
在主对话框框头文件cpp7103Dlg.h中声明消息函数:afx_msg LRESULT OnMessage(WPARAM ap,LPARAM lp);
afx_msg void OnBnClickedButton1();
afx_msg void OnBnClickedCancel2();
afx_msg void OnBnClickedButton2();
afx_msg LRESULT OnMessage(WPARAM ap,LPARAM lp);
afx_msg void OnBnClickedButton3();
然后在.cpp中实现它
LRESULT Ccpp7103Dlg::OnMessage(WPARAM ap, LPARAM lp)
{
return LRESULT();
}
现在还需要将这个消息函数和我们定义的标识联系起来,在.cpp文件中找到这部分代码然后添加:ON_MESSAGE(WM_MSG,&Ccpp7103Dlg::OnMessage)
说明在这个对话框中WM_MSG是和OnMessage相关联的
BEGIN_MESSAGE_MAP(Ccpp7103Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &Ccpp7103Dlg::OnBnClickedButton1)
ON_BN_CLICKED(IDCANCEL2, &Ccpp7103Dlg::OnBnClickedCancel2)
ON_BN_CLICKED(IDC_BUTTON2, &Ccpp7103Dlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON3, &Ccpp7103Dlg::OnBnClickedButton3)
ON_MESSAGE(WM_MSG, &Ccpp7103Dlg::OnMessage)
END_MESSAGE_MAP()
现在主对话框就差发送消息这一步了,在主对话框双击SetDlgText按钮(即发送按钮),跳转到该按钮的事件函数中我们在这里发送消息:
void Ccpp7103Dlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
CString str;
GetDlgItemText(IDC_EDIT1,str); //IDC_EDIT1是主对话框中编辑框的id,右键对话框的属性中找到
m_dlgTest.SendMessage(WM_USER + 1, (WPARAM)&str, 0); //WM_USER + 1我们定义的消息标识,后面两个参数都可以传递消息选择一个,另一个设置为0
}
m_dlgTest是子对话框CTestDlg在主对话框的一个对象,使用前在.h文件定义
CTestDIg m_dlgTest;
然后在.cpp文件OnInitDialog初始化函数额外代码添加的地方记得加上:
// TODO: 在此添加额外的初始化代码
m_dlgTest.Create(IDD_DIALOG1, this);
主对话框的步骤做完了我们现在需要去子对话框接收数据
在子对话框CTestDlg.cpp我们同样加上:
#define WM_MSG (WM_USER+1)
#include "pch.h"
#include "cpp7103.h"
#include "CTestDIg.h"
#include "afxdialogex.h"
#define WM_MSG (WM_USER+1)
然后同样在.h文件声明消息函数
afx_msg LRESULT OnMessage(WPARAM wp, LPARAM lp);
public:
afx_msg void OnBnClickedCancel();
afx_msg LRESULT OnMessage(WPARAM wp, LPARAM lp);
然后在.cpp文件中实现它:
LRESULT CTestDIg::OnMessage(WPARAM wp, LPARAM lp)
{
CString* str;
str = (CString *)wp;
SetDlgItemText(IDC_EDIT1, *str); //这里的IDC_EDIT1是子对话框中编辑框的属性id
return LRESULT();
}
然后一样在.cpp中加上映射:ON_MESSAGE(WM_MSG, &CTestDIg::OnMessage)
BEGIN_MESSAGE_MAP(CTestDIg, CDialogEx)
ON_BN_CLICKED(IDCANCEL, &CTestDIg::OnBnClickedCancel)
ON_MESSAGE(WM_MSG, &CTestDIg::OnMessage)
END_MESSAGE_MAP()
这样子就完成了主对话框向子对话框传递消息:
3. 子对话框向主对话框发送消息
步骤基本完全相同,不过是把主对话框和子对话框的位置兑换了一下
不过有一个需要注意的点是,我们在主对话框中给子对话框发送消息的时候用的是m_dlgTest.SendMessage(WM_USER + 1, (WPARAM)&str, 0);
其中m_dlgTest是子对话框的对象,我们在要得到这个对象就得在主对话框里#include "CTestDlg"将其包含进来。
如果同样得在子对话框中也把主对话框include进来然后生成主对话框的对象,就变成了两个文件相互包含报错。
解决方法:我们在CTestDlg.h中声明一个指针
m_pdlg
CWnd* m_pdlg;
然后在主对话框的OnInitDialog函数中加入m_dlgTest.m_pdlg = this;
// TODO: 在此添加额外的初始化代码
m_dlgTest.Create(IDD_DIALOG1, this);
m_dlgTest.m_pdlg = this;
之后在子对话框中按下按钮发送消息事件的时候用m_pdlg指针调用sendmessage或者postmessage函数就可以了,因为现在m_pdlg指针指向的是发送对象主对话框。
4. 用PostMessage发送消息
步骤和用sendmessage完全一样,有一个要改动的是存储消息的变量不能是局部变量,应该用一个全局变量进行代替,否则可能会出现乱码现象,具体可以看主页另一篇文章。