在 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 对话框时,它的控件是不是被破坏?的主要内容,如果未能解决你的问题,请参考以下文章