MS文档 (和其他)“清楚地”声明:
..。因为普通的OnOk和OnCancel成员函数的CDialog对象将调用EndDialog,所以确保您的非模态对话框不会调用这些函数,而是会重写。
由于CDialog::OnOk有效地调用了CDialog::EndDialog,因此该方法如下所示:
void CDialog::EndDialog(int nResult)
{
ASSERT(::IsWindow(m_hWnd));
if (m_nFlags & (WF_MODALLOOP|WF_CONTINUEMODAL))
EndModalLoop(nResult);
::EndDialog(m_hWnd, nResult);
}我们还可以检查::EndDialog,它再次“清楚地”声明:
由DialogBox、DialogBoxParam、DialogBoxIndirect和DialogBoxIndirectParam函数创建的对话框必须使用EndDialog函数销毁。应用程序从对话框过程中调用EndDialog;该函数不得用于任何其他用途。
然而,我有一个CDialog派生类,它具有它的默认行为wrt。当我使用非模态/非模态时,OnOK和表面上所有的东西都在工作。
也就是说:*当我关闭(无模式)对话框时,它将被关闭/从视图中删除。*应用程序没有显示任何内存泄漏。(MFC调试生成)
那又怎么样?我需要预防EndDialog并亲自打电话给DestroyWindow吗?
注意:我知道文档和“网络”是怎么说的。只是我还没有找到为什么我需要用不同的方式来做,而且这个类应该可以用于非模态模式和模态模式,所以不需要做任何不同的事情可能很方便。
发布于 2013-05-04 08:21:40
MSDN文档 for CDialog::OnOK清楚地声明
如果在无模式对话框中实现OK按钮,则必须重写OnOK方法并在其中调用DestroyWindow。不要调用基类方法,因为它调用EndDialog,这会使对话框不可见,但不会破坏它。
因此,您需要覆盖CDialog::OnOK并在其中调用DestroyWindow() --下面是来自MSDN的一个修改示例
class CDlg : public CDialog
{
...
BOOL m_bModal;
...
}
CDlg::CDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDlg::IDD, pParent)
{
...
m_bModal = FALSE;
...
}
INT_PTR CDlg::DoModal()
{ m_bModal = TRUE;
const INT_PTR rval = CDialog::DoModal();
m_bModal = FALSE;
return rval;
}
void CDlg::OnOK()
{
if (!UpdateData(TRUE))
{
TRACE(_T("UpdateData failed during dialog termination\n"));
// The UpdateData routine will set focus to correct item
return;
}
if (m_bModal)
EndDialog(IDOK);
else
DestroyWindow();
}
void CDlg::OnCancel()
{
if (m_bModal)
EndDialog(IDCANCEL);
else
DestroyWindow();
}https://stackoverflow.com/questions/16359005
复制相似问题