微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

非模态、自关闭对话框与其他对话框结合的问题

如何解决非模态、自关闭对话框与其他对话框结合的问题

它是关于 MFC-MDI 应用程序的。我添加一个弹出窗口,应该在一段时间后关闭。因此,我创建了一个非模态对话框

CPopupDlg* pDlg = new CPopupDlg(this);
if (pDlg)
{
    pDlg->Create(IDD,this);
    pDlg->ShowWindow(SW_SHOW);
}

它将被 Timer 关闭并在 OnNcDestroy() 中销毁

void CPopupDlg::OnTimer(UINT_PTR nIDEvent)
{
    if (nIDEvent == m_CounterEventID)
    {
        KillTimer(nIDEvent);
        EndDialog(IDCANCEL);
        DestroyWindow();
    }
}

void CPopupDlg::OnNcDestroy()
{
    __super::OnNcDestroy();
    delete this;
}

我的问题是在 CPopupDlg 打开时可能会出现许多其他(模态)对话框和消息框。这些模态对话框通常不会在我的项目中指定父窗口(CDialog 带有 pParentWnd=NULL 的构造函数)。因此,方法CDialog::DoModal() 使用::GetLastActivePopup() 来确定其父窗口。 CPopupDlg 对话框被选为父窗口。因此,当 DoModal() 窗口被计时器关闭时,CPopupDlg 崩溃。

我该如何解决这个问题?

  1. 有没有办法从 CPopupDlg 的结果中排除 ::GetLastAcitvePopup() 对话框?

  2. 有时我看到,非模态对话框使用 RunModalLoop()。这会是解决方案吗?

    popupDlg.Create(IDD,this);
    popupDlg.RunModalLoop(MLF_SHOWONIDLE);
    popupDlg.DestroyWindow();
  1. 如果弹出对话框永远不会被关闭和销毁,而只是隐藏,会发生什么。如果调用 CPopupDlg,作为 popupDlg.ShowWindow(SW_HIDE) wnd 的不希望子代的其他模态对话框窗口也会消失吗?

解决方法

我的解决方案是将弹出窗口创建为单独的桌面子窗口。它不是应用程序的子窗口,不会被 ::GetLastActivePopup() 选择。

CPopupDlg* pDlg = new CPopupDlg(this);
if (pDlg)
{
    pDlg->Create(IDD,GetDesktopWindow());
    pDlg->ShowWindow(SW_SHOW);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。