对话框之间的参数传递

今天遇到个问题:在函数里面,创建模态对话框,然后模态对话框在销毁的时候怎样把自己的参数传递给函数中某个临时变量;

考虑了半天:之前想的是通过Sendmessage PostMessage消息传递 或者获取父窗口指针传递。

后来:看了以下文章,直接赋值即可,恍然大悟。谢谢了。

对话框之间的参数传递

1. 模态对话框
由父窗口传递参数给子窗口

反过来感觉不太可能,还没看到类似的实现.主要原因在于,一旦调用DoModal()函数,控制权就会交给调用该函数的对话框,一直到点击了OK或CANCEL退出,而且只会返回有限的几种值,如IDOK,IDCANCEL

示例:

[cpp]  view plain copy
  1. void ADlg::OnPopbtn()   
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     BDlg pbdlg;  
  5.     pbdlg.m_edit="i love u";  
  6. //  pbdlg.UpdateData(FALSE);  
  7.     pbdlg.DoModal();  
  8. }  

注意:PopDlg 对象dlg(子窗口)不能调用UpdateData()函数,否则会出错

         在dlg的InitDlg()函数中,是否会有m_edit的处理。因为在DoModal()函数会自动调用InitDlg()。

这样,在点击了Pop按钮之后,就会弹出的对话框中m_edit关联的EDIT中显示“i love u”。

由子窗口传递参数给父窗口

做实验发现,用非模态对话框的方法也可以。即:在子窗口中建立到父窗口的指针,然后给其成员变量赋值。

代码:

[cpp]  view plain copy
  1. void BDlg::OnOK()   
  2. {  
  3.  // TODO: Add extra validation here  
[cpp]  view plain copy
  1.  ADlg * adlg=(ADlg *)this->GetParent();  
  2.  adlg->m_edit="i hate u";  
  3.  adlg->UpdateData(FALSE);  
  4.   
  5.  CDialog::OnOK();  
  6. }  

 

2. 非模态对话框
由父窗口传递参数给子窗口

方法同模态对话框类似。

代码如下:

[cpp]  view plain copy
  1. void ADlg::OnPopbtn()   
  2. {  
  3.     // TODO: Add your control notification handler code here  
[cpp]  view plain copy
  1.     BDlg * pbdlg=new BDlg();  
  2.     pbdlg->m_edit="i love u";  
  3.     pbdlg->Create(IDD_DIALOG1, (CWnd *)this);  
  4.     pbdlg->ShowWindow(SW_SHOW);  
  5. }  

注意:在使用非模态对话框时,如果用普通的变量,则该函数结束之后,变量的生存期就自动结束,所以窗口不会显示出来。

解决方法只能用指针(内存空间在栈上),或成员变量来解决。

个人觉得用成员变量更合适些,因为用指针会涉及到销毁问题,而析构函数并不知道该指针的地址,所以无法销毁,从而造成内存的泄露。
代码如下:

[cpp]  view plain copy
  1. private:  
  2.     BDlg * m_pbdlg;  

申明为指针便于动态进行构造,以免内存空间浪费。需要注意初始化。

[cpp]  view plain copy
  1. if(m_pbdlg==NULL)  
  2.     m_pdlg=new BDlg();  
  3.   
  4. m_pbdlg->m_edit="i love u";  
  5. m_pbdlg->Create(IDD_DIALOG1, (CWnd *)this);  
  6. m_pbdlg->ShowWindow(SW_SHOW);  

 

由子窗口传递参数给父窗口

假设父窗口对应类为ADlg,子窗口对应类为BDlg。

代码如下:

[cpp]  view plain copy
  1. void BDlg::OnOK()   
  2. {  
  3.  // TODO: Add extra validation here  
[cpp]  view plain copy
  1. ADlg * adlg=(ADlg *)this->GetParent();  
  2. adlg->m_edit="i hate u";  
  3. adlg->UpdateData(FALSE);  
  4.   
  5. DestroyWindow();  
  6. //CDialog::OnOK();  

非模态对话框的一个问题在于,调用CDialog的OnOK()函数时,会隐藏该对话框,而非销毁,所以需要调用DestoryWindow()函数来销毁窗口自己。


最佳方法:

是在看孙鑫的VC视频的时候看到的,确实是高人呀!

由于非模态对话框的执行并不会阻塞主对话框的执行,所以大多数时候只能用模态对话框。

对话框在执行DoModal()函数后,返回的时候窗口被销毁,但该对象仍然存在,所以仍然可以访问其中的成员变量。

示例如下:

[cpp]  view plain copy
  1. void ADlg::OnPopbtn()   
  2. {  
  3. <span style="white-space:pre">  </span>// TODO: Add your control notification handler code hereBDlg bdlg;  
[cpp]  view plain copy
  1. if(updateDlg.DoModal()==IDOK)  
[cpp]  view plain copy
  1. {  
  2.     CString sName=bdlg.m_sName;  
  3.     CString sID=bdlg.m_sID;  
  4. }  
即可以在主对话框中直接访问模态对话框对象的成员变量,而不用非得在子对话框中获取父对话框的指针来传递参数。

http://blog.csdn.net/xiaobai1593/article/details/6591893

你可能感兴趣的:(对话框,消息传递模态)