检测MFC模式对话框(Detecting modal dialogs in MFC)

2019-07-01 11:58发布

我如何编程方式检测如果我MFC应用程序目前正在显示一个模式对话框或属性表? 目前我使用的是下面的,但我觉得代码也将触发模式对话框。

bool HasModalDialog(const CWnd* pWnd)
{
   const CWnd* pChildWnd = pWnd ? pWnd->GetNextWindow(GW_HWNDPREV) : NULL;
   while (pChildWnd)
   {
      if (pWnd == pChildWnd->GetTopLevelParent() &&
         (pChildWnd->IsKindOf(RUNTIME_CLASS(CDialog)) ||
         pChildWnd->IsKindOf(RUNTIME_CLASS(CPropertySheet))))
      {
         return true;
      }

      pChildWnd = pChildWnd->GetNextWindow(GW_HWNDPREV);
   }

   return false;
}

用法:

HasModalDialog(AfxGetMainWnd())

任何人得到的检测模态对话框一个替代方式?

Answer 1:

您是否尝试过CWnd::GetLastActivePopup

我没有测试过这个,看看它是否会为仅模式对话框工作。


编辑1:根据雷蒙德陈 , GetLastActivePopup应该返回当前活动的模态对话框。

编辑2:也许是另一种方法来检索当前模式窗口将修改代码以检查是否有残疾父母/所有者-模式对话框应始终禁用它们的主人显示之前。



Answer 2:

如果只检测到您的应用程序中的窗口,那么你可以派生自己的CDialog和CPropertySheet的,把一个简单的布尔在那里,跟踪它是否是模式与否。

bool HasModalDialog(const CWnd* pWnd)
{
   const CWnd* pChildWnd = pWnd ? pWnd->GetNextWindow(GW_HWNDPREV) : NULL;
   while (pChildWnd)
   {
      if (pWnd == pChildWnd->GetTopLevelParent() )
      {
         if ( pChildWnd->IsKindOf(RUNTIME_CLASS(CMyDialog) )
         {
             return ((CMyDialog*)pChildWnd)->IsModal();
         }

         if ( pChildWnd->IsKindOf(RUNTIME_CLASS(CMyPropertySheet) )
         {
             return ((CMyPropertySheet*)pChildWnd)->IsModal();
         }
      }
      pChildWnd = pChildWnd->GetNextWindow(GW_HWNDPREV);
   }

   return false;
}

必须有另一种方式做到这一点,但是,这是我能想到的把我的头顶部的唯一途径。



Answer 3:

我试过许多方法来解决这个问题,所以我需要的,因为我处理的代码,声明所有对话框,指针在heapmemory(TDialog * d =新TDialog)分配,这是OWL代码,我把它转化为MFC我想自动删除这些指针只有在对话框是模态它是不是在堆中分配的,所以我需要检查它在我的解决方案很容易覆盖的DoModal在我的继承类,并设置一个标志isModal为true,如果它是使用的DoModal标志isModal仍将NULL_PTR,因为它是在构造函数初始化未显示

class  : public CDialog
{
    private:
        bool isModal
    public:
        CMyDlg(int id, CWnd* parent = NULL) : CDialog(id, parent), isModal(false)
        {

        }

        virtual INT_PTR DoModal()
        {
            isModal = true;
            return CDialog::DoModal();//return __super::DoModal();
        }

        bool IsModal()
        {
            return isModal;
        }

        virtual void OnCancel()
        {
            if(isModal)
            {
                CDialog::OnCancel();
            }
            else
            {
                DestroyWindow();
            }
        }

        virtual void OnOk()
        {
            if(isModal)
            {
                CDialog::OnCancel();
            }
            else
            {
                DestroyWindow();
            }
        }
        virtual void PostNcDestroy()
        {
            delete this;
        }
}


文章来源: Detecting modal dialogs in MFC