以模态对话框为例进行不同对话框之间的信息传递
这里主要是通过主对话框的编辑框,输入信息,然后传递给模态对话框的编辑框同时在模态对话框取消或者确定时向主对话框的编辑框中显示信息,几种方法都是这样的例子。
目录
①、全局变量法:
在主对话框中进行定义一个全局变量,使用该全局变量获得主对话框的编辑框的信息,并在模态文件中的初始化环节把得到的信息在模态文件的编辑框进行显示,同时通过向模态对话框编辑框写入信息后点击ok或者取消按钮在主对话框的编辑区进行显示
//主对话框
//定义一个全局变量
CString strText;
//模态对话框的创建
void CMFCtestDlg::OnCreateDialog()
{
//创建好模态对话框以后,程序就会阻塞在这里,后面的程序无法执行
//直到模态对话框被关闭
//获取主对话框中编辑框的信息通过GetDlgItemText
GetDlgItemText(IDC_EDIT1, strText);
CMydialog dlg;
dlg.DoModal();
//MessageBox(_T("关闭模态对话框后显示该窗口"));
//当模态对话框中点击确定或者取消后会执行该下面的代码
SetDlgItemText(IDC_EDIT1, strText)
}
//模态对话框
//如果找不到Oninit的,看我上一篇博客,即可模态对话框的创建,同时需要在模块对话框的类头文件
//添加extern CString strText;告诉编译器,该变量在其他文件中
BOOL CMydialog::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
SetDlgItemText(IDC_SET_EDIT1, strText);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CMydialog::OnCancel()
{
//DestroyWindow();
GetDlgItemText(IDC_SET_EDIT1, strText);
CDialog::OnCancel();
}
void CMydialog::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//DestroyWindow();
GetDlgItemText(IDC_SET_EDIT1, strText);
CDialog::OnOK();
}
②、主对话框法:AfxGetMainWnd();
通过AfxGetMainWnd();可以获取主对话框的指针,因此可以操作信息的传递,在模态对话框中的初始化中获取
主对话框的指针,并进行强制类型转换,通过指针获取主对话框编辑框的内容并显示,然后在模态对话框的确定和取消的
函数中也进行获取主对话框的指针,并进行强制类型转换,通过获取模态对话框的内容,然后通过指针写入主对话框
如下程序:
//初始化函数
BOOL CMydialog::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
//SetDlgItemText(IDC_SET_EDIT1, strText);
CString strtext;
//获取主对话框的窗口指针和信息
CMFCtestDlg* pMainWind = (CMFCtestDlg*)AfxGetMainWnd();
pMainWind->GetDlgItemTextW(IDC_EDIT1, strtext);
//显示
SetDlgItemText(IDC_SET_EDIT1, strtext);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
//确定函数
void CMydialog::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//DestroyWindow();
//GetDlgItemText(IDC_SET_EDIT1, strText);
//获取模态对话框编辑框的值
CString str;
GetDlgItemText(IDC_SET_EDIT1, str);
CMFCtestDlg* pMainWind = (CMFCtestDlg*)AfxGetMainWnd();
pMainWind->SetDlgItemTextW(IDC_EDIT1, str);
CDialog::OnOK();
}
//取消函数
void CMydialog::OnCancel()
{
//DestroyWindow();
//GetDlgItemText(IDC_SET_EDIT1, strText);
//获取模态对话框编辑框的值
CString str;
GetDlgItemText(IDC_SET_EDIT1, str);
CMFCtestDlg* pMainWind = (CMFCtestDlg*)AfxGetMainWnd();
pMainWind->SetDlgItemTextW(IDC_EDIT1, str);
CDialog::OnCancel();
}
③、父窗口法:GetParent();
这个方法和指针方法很类似,只是这里需要强调的是,对话框之间的关系是父子关系,例如 这里
主对话框窗口是模态对话框窗口的父窗口,而模态对话框窗口是主对话框窗口的子窗口
实例如下:
//模态对话框初始化
BOOL CMydialog::OnInitDialog()
{
CDialog::OnInitDialog();
// 全局变量法
//SetDlgItemText(IDC_SET_EDIT1, strText);
//②、主对话框法:AfxGetMainWnd();
//CString strtext;
获取主对话框的窗口指针和信息
//CMFCtestDlg* pMainWind = (CMFCtestDlg*)AfxGetMainWnd();
//pMainWind->GetDlgItemTextW(IDC_EDIT1, strtext);
显示
//SetDlgItemText(IDC_SET_EDIT1, strtext);
//③、父窗口法:GetParent();
//获取当前窗口的父窗口
CString strtext;
CMFCtestDlg* pParent = (CMFCtestDlg*)GetParent();
pParent->GetDlgItemTextW(IDC_EDIT1, strtext);
SetDlgItemText(IDC_SET_EDIT1, strtext);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CMydialog::OnCancel()
{
//全局变量法
//GetDlgItemText(IDC_SET_EDIT1, strText);
//②、主对话框法:AfxGetMainWnd();
/*CString str;
GetDlgItemText(IDC_SET_EDIT1, str);
CMFCtestDlg* pMainWind = (CMFCtestDlg*)AfxGetMainWnd();
pMainWind->SetDlgItemTextW(IDC_EDIT1, str);*/
//③、父窗口法:GetParent();
CString str;
GetDlgItemText(IDC_SET_EDIT1, str);
CMFCtestDlg* pParent = (CMFCtestDlg*)GetParent();
pParent->SetDlgItemTextW(IDC_EDIT1, str);
CDialog::OnCancel();
}
void CMydialog::OnBnClickedOk()
{
//全局变量法
//GetDlgItemText(IDC_SET_EDIT1, strText);
//②、主对话框法:AfxGetMainWnd();
/*CString str;
GetDlgItemText(IDC_SET_EDIT1, str);
CMFCtestDlg* pMainWind = (CMFCtestDlg*)AfxGetMainWnd();
pMainWind->SetDlgItemTextW(IDC_EDIT1, str);
*/
//③、父窗口法:GetParent();
CString str;
GetDlgItemText(IDC_SET_EDIT1, str);
CMFCtestDlg* pParent = (CMFCtestDlg*)GetParent();
pParent->SetDlgItemTextW(IDC_EDIT1, str);
CDialog::OnOK();
}
④、成员变量、成员函数法;
首先在模态对话框的头文件中申请一个指针变量CWnd* m_pWnd;,在其构造函数中初始为NULL,然后在主对话框
的创建模态对话框的函数中赋值,即主对话框的地址,然后就可以在模态对话框中进行操作了,具体如下:
//模态对话框的创建
void CMFCtestDlg::OnCreateDialog()
{
//创建好模态对话框以后,程序就会阻塞在这里,后面的程序无法执行
//直到模态对话框被关闭
//获取主对话框中编辑框的信息通过GetDlgItemText
//GetDlgItemText(IDC_EDIT1, strText);
CMydialog dlg;
//对其进行赋值
dlg.m_pWnd = this;
dlg.DoModal();
//MessageBox(_T("关闭模态对话框后显示该窗口"));
//SetDlgItemText(IDC_EDIT1, strText);
}
//模态对话框的初始化函数
BOOL CMydialog::OnInitDialog()
{
CDialog::OnInitDialog();
// 全局变量法
//SetDlgItemText(IDC_SET_EDIT1, strText);
//②、主对话框法:AfxGetMainWnd();
//CString strtext;
获取主对话框的窗口指针和信息
//CMFCtestDlg* pMainWind = (CMFCtestDlg*)AfxGetMainWnd();
//pMainWind->GetDlgItemTextW(IDC_EDIT1, strtext);
显示
//SetDlgItemText(IDC_SET_EDIT1, strtext);
//③、父窗口法:GetParent();
//获取当前窗口的父窗口
/*CString strtext;
CMFCtestDlg* pParent = (CMFCtestDlg*)GetParent();
pParent->GetDlgItemTextW(IDC_EDIT1, strtext);
SetDlgItemText(IDC_SET_EDIT1, strtext);*/
//④、成员变量、成员函数法;
CString strtext;
m_pWnd->GetDlgItemTextW(IDC_EDIT1, strtext);
SetDlgItemText(IDC_SET_EDIT1, strtext);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CMydialog::OnCancel()
{
//全局变量法
//GetDlgItemText(IDC_SET_EDIT1, strText);
//②、主对话框法:AfxGetMainWnd();
/*CString str;
GetDlgItemText(IDC_SET_EDIT1, str);
CMFCtestDlg* pMainWind = (CMFCtestDlg*)AfxGetMainWnd();
pMainWind->SetDlgItemTextW(IDC_EDIT1, str);*/
//③、父窗口法:GetParent();
/*CString str;
GetDlgItemText(IDC_SET_EDIT1, str);
CMFCtestDlg* pParent = (CMFCtestDlg*)GetParent();
pParent->SetDlgItemTextW(IDC_EDIT1, str);*/
//④、成员变量、成员函数法;
CString str;
GetDlgItemText(IDC_SET_EDIT1, str);
m_pWnd->SetDlgItemTextW(IDC_EDIT1, str);
CDialog::OnCancel();
}
void CMydialog::OnBnClickedOk()
{
//全局变量法
//GetDlgItemText(IDC_SET_EDIT1, strText);
//②、主对话框法:AfxGetMainWnd();
/*CString str;
GetDlgItemText(IDC_SET_EDIT1, str);
CMFCtestDlg* pMainWind = (CMFCtestDlg*)AfxGetMainWnd();
pMainWind->SetDlgItemTextW(IDC_EDIT1, str);
*/
//③、父窗口法:GetParent();
/*CString str;
GetDlgItemText(IDC_SET_EDIT1, str);
CMFCtestDlg* pParent = (CMFCtestDlg*)GetParent();
pParent->SetDlgItemTextW(IDC_EDIT1, str);*/
//④、成员变量、成员函数法;
CString str;
GetDlgItemText(IDC_SET_EDIT1, str);
m_pWnd->SetDlgItemTextW(IDC_EDIT1, str);
CDialog::OnOK();
}
大家跑一边即可,这里记录下来的目的是怕以后自己会忘,可以过来查即可。