2016-11-14 46 views
0

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

我创造它像:

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

,并在创建时我按OK。

+1

创建它之后,接下来做了什么?你期待它显示吗? – rrirower

+0

显示更多的代码。 –

+0

*“如何知道此表单不可见?”* - 有可能是[CWnd :: IsWindowVisible](https://msdn.microsoft.com/library/49a832ee-bc34-4126-88b3-bc1d9974f6c4.aspx# cwnd__iswindowvisible)将返回该信息。而且,正如我以前多次解释过的那样,如果不熟悉Windows API,就不可能希望熟练掌握MFC。你将继续在微小和微小的问题上磕磕绊绊(像这样)。不知道如何使用调试器也不会证明有用。 – IInspectable

回答

0

我不知道你的意思是“它的构造函数没有执行”......我假设你的意思是说它的析构函数没有被执行。

这是对的。

最终,会发生什么情况是API函数EndDialog(m_hWwnd, IDOK)在您的对话框中被调用。这会导致您的对话框被隐藏。

但是,对话框的窗口句柄及其指针仍然有效。在程序终止时,窗口将被销毁,但你的C++析构函数将永远不会被调用。如果你想确保你的析构函数被调用,overried 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中去做()像我一样,那么你NEVER要拨打电话,如:

delete statusDlg; // bad things will happen... (attempted double deletion) 

相反,你想这样做:

statusDlg->DestroyWindow(); // PostNcDestroy() takes care of deletion 

我上述说法适用于无模式对话。对于模态对话框,它稍有不同。

+0

*“这会导致您的对话框被隐藏,但对话框的窗口句柄仍然有效。”* - 这是不正确的。 [EndDialog](https://msdn.microsoft.com/en-us/library/windows/desktop/ms645472.aspx)导致本地对话框对象被销毁(同样使其'HWND'无效)。你的解决方法也相当脆弱,我不会推荐它。相反,您应该通过C++类来控制对象的生命周期(即,当不再需要时,使用'delete statusDlg;'做**)。 – IInspectable

+0

恭喜你,你错了。我知道,因为我写了一个小测试应用程序 - 在VS 2013(我怀疑它已经改变)。对于无模式MFC对话框,窗口关闭后窗口句柄仍然有效。该窗口直到过程结束才被销毁。我知道是因为我在PostNcDestroy()中设置了一个断点,并且在应用程序终止之前它不会被调用。 如果你愿意,可以称它很脆弱,但MFC对于CView和CFrameWnd类是一样的。 –

+0

你是说,[EndDialog](https://msdn.microsoft.com/en-us/library/windows/desktop/ms645472.aspx)的API文档是错误的?还是你误解了这个事实,它确实被调用了,但实际上没有? – IInspectable

相关问题