区分无模式与模式对话框

Distinguish modeless vs modal dialog

我想对模态对话框使用相同的 class 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
}

如何直接确定 class 是构建为无模式对话框还是模式对话框?

检查对话框的 m_nModalResult。如果是 -1 - 对话框是无模式的;否则它将是 IDOK、IDCANCEL 等代码之一。

[编辑以回答评论]

这与原题不同。 在 OK/Cancel 处理程序中,您可以测试:

if (m_nFlags & WF_MODALLOOP)

如果 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();
}