正文

两对话框通信实例MFC(2)2006-12-21 18:23:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/bills/21794.html

分享到:


//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”得出下面两个对话框:


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

 

 

阅读(7052) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册