在DoModal之后隐藏MFC对话框时,其控件是否被销毁?

时间:2010-07-21 12:59:57

标签: c++ mfc winapi

我之前使用过MFC对话框:

EnterNameDlg dlg;
dlg.DoModal();
string str = dlg.GetName();

然而,我现在实际上看到一个对话框实际上是在这样的方法中查看列表框控件并且它不起作用。尽管在DoModal()之后类实例显然存在,但实际的对话框是否会被销毁?我注意到第二次调用DoModal()导致OnInitDialog()再次被调用,这似乎支持这个理论,对话框是从模板重新创建的,而不是简单地第二次显示。

3 个答案:

答案 0 :(得分:3)

是的,DoModal会在每次调用时创建一个对话框并在返回之前销毁该窗口。

只有数据成员仍然有效。当然,如果要在对话框的生命周期内收集数据,可以在EnterNameDlg类中添加更多数据成员。
一旦dlg超出范围,一切都将被解除分配。

答案 1 :(得分:2)

DoModal类实例仍然存在,但窗口及其所有控件都被销毁。在DoModal之后,您只能调用不能使用对话框控件的函数。在对话框类的内部,按下OK按钮时,在CString等类成员中保留必需的值。关闭对话框后可以读取这些成员。

答案 2 :(得分:1)

整个MFC是围绕一个笨拙的配对构建的 - Windows窗口及其关联的句柄,以及MFC类对象。在大多数情况下,MFC类被设计为比窗口更长。