【问题标题】:Distinguish modeless vs modal dialog区分无模式与模式对话框
【发布时间】:2015-12-13 06:14:46
【问题描述】:

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

如何直接确定该类是构造为无模式对话框还是模式对话框?

【问题讨论】:

  • 是的,如果对话框被构造为模式对话框(在堆栈上),我想避免删除。通常,无模式对话框对象在堆上的某处创建并在 PostNcDestroy() 中自行销毁
  • 您是否尝试过检查DS_MODALFRAME 样式?
  • 你需要离开删除这个;否则你会有内存泄漏
  • @rrrower 我已经检查过了,它有相同的样式,我使用相同的类和对话框资源。

标签: mfc dialog modal-dialog


【解决方案1】:

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

[编辑回答评论]

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

if (m_nFlags & WF_MODALLOOP)

【讨论】:

  • 几乎,接近解决方案。是的 m_nModalResult 在 OnNcDestroy() 中给出正确的结果。但是我不能在 OnOk() 和 OnCancel() 中使用这个变量。 :( void CTestDialog::OnOK() { if (UpdateData(TRUE)) { if (m_bModeless) DestroyWindow(); DestroyWindow(); else CDialogEx::OnOK(); } } void CTestDialog::OnCancel() { if ( m_bModeless) DestroyWindow(); 否则 CDialogEx::OnOK(); }
  • 能否将 OnOK 和 OnCancel 方法的代码添加到您的初始帖子中?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    相关资源
    最近更新 更多