我希望在模态对话框中使用相同的类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
}如何简单地确定类是以无模式或模态对话框的形式构造的呢?
发布于 2015-09-16 17:13:20
如果MFC对话框本身能够区分非模态对话框和模态对话框,我已经放弃了搜索解决方案。
这个解决办法对我有用。我扩展了构造函数,以判断它是非模态的还是模态的。
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();
}发布于 2015-09-16 15:57:06
检查对话框的m_nModalResult。如果是-1 -对话框是无模式的;否则它将是一个IDOK,IDCANCEL等代码。
编辑以回答评论
这与原来的问题不同。在OK/Cancel处理程序中,您可以测试:
if (m_nFlags & WF_MODALLOOP)https://stackoverflow.com/questions/32612329
复制相似问题