首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

关于DoModal解决方案

2013-12-04 
关于DoModal现有两个对话框Dlg1和Dlg2,以及分别有一个列表框List1,List2。大致架构是Dlg1按Button进入Dlg2,

关于DoModal
现有两个对话框Dlg1和Dlg2,以及分别有一个列表框List1,List2。大致架构是Dlg1按Button进入Dlg2,然后在Dlg2中的List2中选择好后按IDOK

返回Dlg1并把List2的数据传回Dlg1的List1。
void COsdAddDlg::OnBtnAddbmp()                   //Dlg1
{
// TODO: Add your control notification handler code here
CBMPSelectDlg dlg2;
if( dlg2.DoModal() == IDOK )
{
   CString str;
   int i;
#if 0
  WORD a;
  a = dlg2.m_wTest;
  str.Format("a = %d",a);
  MessageBox(str);
#else
   for( i = dlg2.List2.GetCount() - 1; i >=0;i -- )
   {
if( dlg2.List2.GetSel(i) )
{
dlg2.List2.GetText(i,str);
List1.AddString(str);
}
   }
#endif
}
}
但这段代码会报错。
我的问题是当执行if( dlg2.DoModal() == IDOK )后,即在Dlg2中按OK返回Dlg1时,是否Dlg2已经销毁,数据不能用了吗?
但之后我做了一个实验,dlg2加了一个成员变量m_wTest,然后把上面代码的#if 0改成#if 1,则不会报错,并且数据回传正确,即证明当执行if( dlg2.DoModal() == IDOK )后Dlg2尚未销毁,那么为什么前者报错而后者正常运行?望各位不吝赐教。 Dialog之间数据互传? ListBox
[解决办法]
与 句柄 相关的数据不可用。 比如获取dlg2中listbox的某项Text,这是不对的。

其余数据可用。比如你自己定义的成员变量 MyStruct m_ms;
[解决办法]
DoModal结束,窗体也就销毁了,但是不要把窗体销毁跟对象销毁看成一个概念,窗体类本质上也就是一般的C++类封装了窗体句柄HWND和相关操作函数的类而已。

所以,DoMadal函数执行完毕,窗体的句柄也就不存在了,但是对象还在,对象保存的元素还在。如果你非要操作对话框2,那就不该做成模态的,而应该是Create的非模态

热点排行