区分无模式对模态对话框

时间:2015-09-16 15:04:41

标签: mfc dialog modal-dialog

我想使用相同的类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
}

如何以直截了当的方式确定该类是否构建为无模式或模态对话框?

2 个答案:

答案 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();
}