单击确定按钮后,MFC对话框窗体会发生什么

时间:2016-11-14 13:15:47

标签: visual-c++ mfc

单击MFC按钮时OK对话框表单会发生什么情况。看起来它没有被破坏,因为它的构造函数没有被执行。我有指向此表单StatusDlg * statusDlg;的指针。如何知道这个表格是不可见的?如何再次使用此表单并向用户显示? 如何完全破坏这种形式?

我创建它:

statusDlg = new StatusDlg(NULL);
statusDlg->Create(StatusDlg::IDD,CWnd::GetDesktopWindow());
statusDlg->ShowWindow(SW_SHOW);

创建时我按OK。

1 个答案:

答案 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

我上面所说的无模式对话框也适用。对于模态对话框,它略有不同。