我想使用相同的类CTestDialog
作为模态对话框
CTestDialog dlg;
dlg.DoModal();
和无模式对话
m_pDlg = new CTestDialog;
m_pDlg->Create(CTestDialog::IDD,this);
m_pDlg->ShowWindow(SW_SHOW);
我遇到的问题是PostNcDestroy(..),如果它被构造为模态对话框,它会崩溃:
void CTestDialog::PostNcDestroy()
{
CDialog::PostNcDestroy();
delete this; // <= need for modeless, but Crash! if constructed as modal Dialog
}
如何以直截了当的方式确定该类是否构建为无模式或模态对话框?
答案 0 :(得分:2)
检查对话框的m_nModalResult。如果是-1 - 对话框是无模式的;否则它将是IDOK,IDCANCEL等代码之一。
[编辑回答评论]
这与原始问题不同。 在OK / Cancel处理程序中,您可以测试:
if (m_nFlags & WF_MODALLOOP)
答案 1 :(得分:1)
如果MFC Dialog本身可以在无模式对话模式对话框之间徘徊,我已经放弃了搜索解决方案。
此解决方法适合我。 我已经扩展了构造函数,以判断它是无模态还是模态。
CTestDialog::CTestDialog(CWnd* pParent /*=NULL*/, BOOL bModeless /*=false*/)
: CDialogEx(CTestDialog::IDD, pParent)
, m_bModeless(bModeless)
{
}
void CTestDialog::PostNcDestroy()
{
CDialogEx::PostNcDestroy();
if (m_bModeless)
delete this;
}
void CTestDialog::OnOK()
{
if (UpdateData(TRUE))
{
if (m_bModeless)
DestroyWindow();
else
CDialogEx::OnOK();
}
void CTestDialog::OnCancel()
{
if (m_bModeless)
DestroyWindow();
else
CDialogEx::OnOK();
}