//2006年12月21日作
//作者:InitInstance
在VC中要实现两个对话框的通信并不是很难的,对话框之间的通信问题归根到底就是类之间的通信问题,掌握了C++类之间的通信问题,一切均可迎刃而解。应网友的邀请我当即做了个简单的应用示范,现在这里总结一下:
过程:建立一个基于对话框类型的工程,再另外从中插入两个对话框资源模版(resource template)并为两个对话框资源模版关联两个类且都是派生于CDialog,两个类分别简单的命名为CDlg1,CDlg2,主对话框类为A,在主对话框A上有两个按钮,1:“显示对话框CDlg1”2:“显示对话框CDlg2”对话框CDlg1上又有一个按钮名为:“导出数据”,对话框CDlg2上有一个列表框控件,负责显示数据,当点击对话框CDlg1上的“导出数据”按钮时,数据立即在对话框CDlg2上显示出来了,要能实现这个过程,还得在类CDlg1中添加一个类型为CDlg2*的成员变量m_pdlg2,这样对话框CDlg1才能跟CDlg2通信,要实现CDlg2跟CDlg1通信,在CDlg2中添加CDlg1类型的一个指针变量即可,这里只是示例,我就不写了^_^。
在主对话框CExam3Dlg(我的主对话框类命名为CExam3Dlg)中,要实现通过点击按钮产生出对话框CDlg1和CDlg2,就要将类CDlg1和CDlg2的两个对象m_dlg1,m_dlg2作为主对话框CExam3Dlg的成员,现在暂时将其都设为公有的(public)。好,有了它们的两个对象就开始吧,响应“显示对话框1”和“显示对话框2”的函数分别为 void OnButton1() void OnButton2()代码如下:
//////////////////////////////////////////////////////////////////////
void CExam3Dlg::OnButton1()
{
if(!m_dlg1.m_hWnd)
{
m_dlg1.Create(IDD_DIALOG1);
m_dlg1.ShowWindow(SW_SHOW);
}
else
{
m_dlg1.DestroyWindow();//销毁先前的窗口
m_dlg1.Create(IDD_DIALOG1);//在重新创建
m_dlg1.ShowWindow(SW_SHOW);
}
if(!m_dlg2.m_hWnd)//如果此时对话框2还没有创建
{
m_dlg1.m_pdlg2=&m_dlg2;//那么赋值的地址将是个无效的地址。
}
}
//---------------------------------------------
void CExam3Dlg::OnButton2()
{
if(!m_dlg2.m_hWnd)//对话框2没有创建
{
m_dlg2.Create(IDD_DIALOG2);
m_dlg2.ShowWindow(SW_SHOW);
m_dlg1.m_pdlg2=&m_dlg2;//把对话宽框2的对象地址赋值给m_dlg1的m_dlg2成员
//这才能实现两个对话框之间的通信
}
}
//---------------------------------------------------
在对话框CDlg1中又有一个“导出数据”按钮,响应函数为void OnOutData()
如下:
void CDlg1::OnOutData()
{
if(!(m_pdlg2->m_hWnd))
{
MessageBox("对话框2还没创建!","你好!",MB_OK);
return;
}
else
{
//在对话框CDlg2的列表框上显示一些数据
((CListBox *)(m_b2->GetDlgItem(IDC_LIST1)))->AddString("张三");
((CListBox*)(m_b2->GetDlgItem(IDC_LIST1)))->AddString("李四");
((CListBox*)(m_b2->GetDlgItem(IDC_LIST1)))->AddString("王五");
((CListBox*)(m_b2->GetDlgItem(IDC_LIST1)))->AddString("斯通");
((CListBox*)(m_b2->GetDlgItem(IDC_LIST1)))->AddString("啊强");
}
//MessageBox("两个对话框通信的例子");
}
好了由于CDlg1和CDlg2都是非模态的,故CDlg2得实现OnOk()和OnCancel()两个虚函数以便用来销毁对话框窗口CDlg2
void CDlg2::OnOK()
{
DestroyWindow();
}
void CDlg2::OnCancel()
{
DestroyWindow();
}
这就是基本的实现过程,程序运行良好。

分别点击点击“显示对话框1”“显示对话框2”得出下面两个对话框:

点击“导出数据按钮”在下面的对话框中显示数据


评论