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

Problem with a non-modal, self-closing dialog in combination with other dialogs

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

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

它将被定时器关闭并在 OnNcDestroy() 中销毁

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

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

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

我该如何解决这个问题?

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

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

    popupDlg.Create(IDD, this);
    popupDlg.RunModalLoop(MLF_SHOWONIDLE);
    popupDlg.DestroyWindow();
  1. 如果弹出对话框永远不会关闭和销毁,而只会隐藏,会发生什么情况。如果调用 popupDlg.ShowWindow(SW_HIDE),其他模态对话框 windows,它们是 CPopupDlg wnd 的不需要的子项,是否也会消失?

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

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