首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CDialog -来自MODELESS对话框的EndDialog?

CDialog -来自MODELESS对话框的EndDialog?
EN

Stack Overflow用户
提问于 2013-05-03 12:31:43
回答 1查看 3.8K关注 0票数 3

MS文档 (和其他)“清楚地”声明:

..。因为普通的OnOk和OnCancel成员函数的CDialog对象将调用EndDialog,所以确保您的非模态对话框不会调用这些函数,而是会重写。

由于CDialog::OnOk有效地调用了CDialog::EndDialog,因此该方法如下所示:

代码语言:javascript
复制
void CDialog::EndDialog(int nResult)
{
    ASSERT(::IsWindow(m_hWnd));

    if (m_nFlags & (WF_MODALLOOP|WF_CONTINUEMODAL))
        EndModalLoop(nResult);

    ::EndDialog(m_hWnd, nResult);
}

我们还可以检查::EndDialog,它再次“清楚地”声明:

由DialogBox、DialogBoxParam、DialogBoxIndirect和DialogBoxIndirectParam函数创建的对话框必须使用EndDialog函数销毁。应用程序从对话框过程中调用EndDialog;该函数不得用于任何其他用途。

然而,我有一个CDialog派生类,它具有它的默认行为wrt。当我使用非模态/非模态时,OnOK和表面上所有的东西都在工作。

也就是说:*当我关闭(无模式)对话框时,它将被关闭/从视图中删除。*应用程序没有显示任何内存泄漏。(MFC调试生成)

那又怎么样?我需要预防EndDialog并亲自打电话给DestroyWindow吗?

注意:我知道文档和“网络”是怎么说的。只是我还没有找到为什么我需要用不同的方式来做,而且这个类应该可以用于非模态模式和模态模式,所以不需要做任何不同的事情可能很方便。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-04 08:21:40

MSDN文档 for CDialog::OnOK清楚地声明

如果在无模式对话框中实现OK按钮,则必须重写OnOK方法并在其中调用DestroyWindow。不要调用基类方法,因为它调用EndDialog,这会使对话框不可见,但不会破坏它。

因此,您需要覆盖CDialog::OnOK并在其中调用DestroyWindow() --下面是来自MSDN的一个修改示例

代码语言:javascript
复制
class CDlg : public CDialog
{
    ...
    BOOL m_bModal;
    ...
}

CDlg::CDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDlg::IDD, pParent)
{
    ...
    m_bModal = FALSE;
    ...
}

INT_PTR CDlg::DoModal()
{   m_bModal = TRUE;
    const INT_PTR rval = CDialog::DoModal();
    m_bModal = FALSE;
    return rval;
}

void CDlg::OnOK() 
{ 
   if (!UpdateData(TRUE)) 
   {
      TRACE(_T("UpdateData failed during dialog termination\n"));
      // The UpdateData routine will set focus to correct item
      return;
   }
   if (m_bModal)
       EndDialog(IDOK);
   else
       DestroyWindow();
}

void CDlg::OnCancel()
{
   if (m_bModal)
       EndDialog(IDCANCEL);
   else
       DestroyWindow();
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16359005

复制
相关文章

相似问题

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