MFC中模态对话框的检测
如何以编程方式检测MFC应用程序当前是否显示模式对话框或属性表?目前我正在使用以下代码,但我觉得代码也会触发无模式对话框MFC中模态对话框的检测,mfc,modal-dialog,Mfc,Modal Dialog,如何以编程方式检测MFC应用程序当前是否显示模式对话框或属性表?目前我正在使用以下代码,但我觉得代码也会触发无模式对话框 bool HasModalDialog(const CWnd* pWnd) { const CWnd* pChildWnd = pWnd ? pWnd->GetNextWindow(GW_HWNDPREV) : NULL; while (pChildWnd) { if (pWnd == pChildWnd->GetTopLevelPa
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())
有人找到了检测模式对话框的替代方法吗?如果您只检测应用程序中的窗口,那么您可以派生自己的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;
}
一定有别的办法,但那是我脑子里唯一能想到的办法。你试过了吗
我还没有测试它是否只适用于模态对话框
编辑1:根据,
GetLastActivePopup
应返回当前活动模式对话框
编辑2:检索当前模式窗口的另一种方法可能是修改代码以检查禁用的父/所有者-模式对话框应始终在显示之前显示。我尝试了许多方法来解决这个问题,为什么我需要它,因为我正在处理的代码将所有对话框声明为在heapmemory中分配的指针(TDialog*d=new TDialog)。这是OWL代码,我将其转换为MFC,我想自动删除这些指针,只有当对话框是模态的,并且没有在堆中分配时,因此,我需要检查它。我的解决方案很容易在继承的类中重写DoModal,并将标志isModal设置为true。如果没有使用DoModal显示,则标志isModal在构造函数中初始化时仍将为null
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;
}
}
我看不出你的代码实际上是如何检测模态对话框的。如果CDialog或CPropertySheet是“Create”d,那么它将是非模态的,并且您的代码仍将返回true。@Goz:这就是代码所遇到的问题。不幸的是,这要求所有对话框都从这些新类派生,而这对MFC中已经存在的对话框类不起作用。事实上不是这样。你也必须为他们制作自己的类包装。。。那将是一个地狱般的假货…“检查一个残疾的父母/所有者”-我只是在想同样的事情。