首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非模态与模态对话框的区分

非模态与模态对话框的区分
EN

Stack Overflow用户
提问于 2015-09-16 15:04:41
回答 2查看 481关注 0票数 1

我希望在模态对话框中使用相同的类CTestDialog

代码语言:javascript
复制
CTestDialog dlg;
dlg.DoModal();

和一个无模式对话框

代码语言:javascript
复制
m_pDlg = new CTestDialog;
m_pDlg->Create(CTestDialog::IDD,this);
m_pDlg->ShowWindow(SW_SHOW);

我遇到的问题是在PostNcDestroy(..)如果它被构造为模态对话框,它就会崩溃:

代码语言:javascript
复制
void CTestDialog::PostNcDestroy() 
{   
  CDialog::PostNcDestroy();
  delete this;                 // <= need for modeless, but Crash! if constructed as modal Dialog
}

如何简单地确定类是以无模式或模态对话框的形式构造的呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-16 17:13:20

如果MFC对话框本身能够区分非模态对话框和模态对话框,我已经放弃了搜索解决方案。

这个解决办法对我有用。我扩展了构造函数,以判断它是非模态的还是模态的。

代码语言:javascript
复制
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();
}
票数 1
EN

Stack Overflow用户

发布于 2015-09-16 15:57:06

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

编辑以回答评论

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

代码语言:javascript
复制
if (m_nFlags & WF_MODALLOOP)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32612329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档