在 DoModal 之后隐藏 MFC 对话框时,它的控件是不是被破坏?

Posted

技术标签:

【中文标题】在 DoModal 之后隐藏 MFC 对话框时,它的控件是不是被破坏?【英文标题】:When an MFC dialog is hidden after DoModal, are its controls destroyed?在 DoModal 之后隐藏 MFC 对话框时,它的控件是否被破坏? 【发布时间】:2010-07-21 12:59:56 【问题描述】:

我之前使用过 MFC 对话框:

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

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

【问题讨论】:

【参考方案1】:

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

只有数据成员仍然有效。当然,如果您想在对话框的生命周期内收集数据,您可以在 EnterNameDlg 类中添加更多数据成员。 一旦 dlg 超出范围,所有内容都将被释放。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于在 DoModal 之后隐藏 MFC 对话框时,它的控件是不是被破坏?的主要内容,如果未能解决你的问题,请参考以下文章

从 CDialog 派生的对话框在 DoModal (MFC/C++) 之后返回 -1

如何初始化模态对话框? (C++/MFC)

MFC DoModal对话

MFC DoModal 对话框

MFC Domodal 返回-1的一种情况

MFC Domodal 返回-1的一种情况