两个对话框通信(MFC)的问题

//作者:InitInstance

在VC中要实现两个对话框的通信并不是很难的,对话框之间的通信问题归根到底就是类之间的通信问题,掌握了C++类之间的通信问题,一切均可迎刃而解。应网友的邀请我当即做了个简单的应用示范,现在这里总结一下:

过程:建立一个基于对话框类型的工程,再另外从中插入两个对话框资源模版(resource template)并为两个对话框资源模版关联两个类且都是派生于CDialog,两个类分别简单的命名为B1,B2,主对话框类为A,在主对话框A上有两个按钮,1:“显示对话框B1”2:“显示对话框B2”对话框B1上又有一个按钮名为:“导出数据”,对话框B2上有一个列表框控件,负责显示数据,当点击对话框B1上的“导出数据”按钮时,数据立即在对话框B2上显示出来了,要能实现这个过程,还得在类B1中添加一个类型为B2的成员变量m_b2,这样的过程也就实现了两个对话框之间通信。


在主对话框A中,要实现通过点击按钮产生出对话框B1和B2,就要将类B1和B2的两个对象m_b1,m_b2作为主对话框A的成员,现在暂时将其都设为公有的(public)。好,有了它们的两个对象就开始吧,响应“显示对话框B1”和“显示对话框B1”的函数分别为 void OnDisplayB1() void OnDisplayB2()代码如下:

//
void CA::OnDisplayB1()
{
     if(!m_b1.m_hWnd)//如果m_b1窗口句柄为空也就是该窗口尚未存在,创建它
     {
       m_b1.Create(IDD_DIALOG1);
       m_b1.ShowWindow(SW_SHOW);
      }
      else//否则,先销毁先前的窗口在重新创建
      { 
        m_b1.DestroyWindow();//先销毁先前的窗口
        m_b1.Create(IDD_DIALOG1);
        m_b1.ShowWindow(SW_SHOW);//显示窗口
  
      }


}
//---------------------------------------------
extern  isDestroy;//全局的变量,设置该变量的目的是判断对话框B2的存在与否
void CA::OnDisplayB2()
{

  if(!m_page2.m_hWnd)//如果该窗口尚未创建
  {
   m_b2.Create(IDD_DIALOG2);
   m_b2.ShowWindow(SW_SHOW);
   m_b1.m_b2=&m_b2;//把对话框B2的对象m_b2的地址赋给对话框B1的成员m_b2
   isDestroy=false;//对话框2被创建,也就是没有被销毁,isDestroy也就设置为FALSE了^_^
   }
   
}

在对话框B1中又有一个“导出数据”按钮,响应函数为void OnOutData()
extern  isDestroy;
void CB1::OnOutData()
{

   if(isDestroy)//首先判断对话框B2是否存在了
   {
     MessageBox("对话框B2尚未创建!","你好!",MB_OK);
     return;//对话框B2都不存在就不能导出数据到B2了,返回!
   }
   else//对话框B2是存在的
  {
          //在对话框B2的列表框上显示一些数据
 ((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("两个对话框通信的例子");


}

好了由于B1和B2都是非模态的,故B2得实现OnOk()和OnCancel()两个虚函数以便用来销毁对话框窗口B2
// CB2 message handler*
**tern isDestroy;
void CB2::OnOK()
{
   
    DestroyWindow();
    isDestroy=true;//销毁了

  
}

void CB2::OnCancel()
{
   DestroyWindow();
   isDestroy=true;//销毁了


}

这就是基本的实现过程,程序实现良好。

 

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

 

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值