单击MFC
按钮时OK
对话框表单会发生什么情况。看起来它没有被破坏,因为它的构造函数没有被执行。我有指向此表单StatusDlg * statusDlg;
的指针。如何知道这个表格是不可见的?如何再次使用此表单并向用户显示?
如何完全破坏这种形式?
我创建它:
statusDlg = new StatusDlg(NULL);
statusDlg->Create(StatusDlg::IDD,CWnd::GetDesktopWindow());
statusDlg->ShowWindow(SW_SHOW);
创建时我按OK。
答案 0 :(得分:0)
我不知道你的意思是“它的构造函数没有被执行”......我猜你的意思是说它的析构函数没有被执行。
那是真的。
最终,会在对话框中调用API函数EndDialog(m_hWwnd, IDOK)
。这会导致您的对话框被隐藏。
但是,对话框的窗口句柄及其指针仍然有效。程序终止时,窗口将被销毁,但仍然不会调用C ++析构函数。如果你想确保你的析构函数被调用,像这样覆盖PostNcDestroy():
void StatusDlg::PostNcDestroy()
{
__super::PostNcDestroy();// might be able to be skipped if baseclass does nothing, which I suspect is the case
delete this; // deletes this StatusDlg
}
您的statusDlg指针可以告诉您窗口是否可见。只需调用statusDlg->IsWindowVisible()
- 假设您在某处挂起statusDlg指针。
如果你像我一样覆盖PostNcDestroy(),那么从不想要拨打电话:
delete statusDlg; // bad things will happen... (attempted double deletion)
相反,你想这样做:
statusDlg->DestroyWindow(); // PostNcDestroy() takes care of deletion
我上面所说的无模式对话框也适用。对于模态对话框,它略有不同。