如何解决非模态、自关闭对话框与其他对话框结合的问题
它是关于 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
崩溃。
我该如何解决这个问题?
-
有没有办法从
CPopupDlg
的结果中排除::GetLastAcitvePopup()
对话框? -
有时我看到,非模态对话框使用
RunModalLoop()
。这会是解决方案吗?
popupDlg.Create(IDD,this);
popupDlg.RunModalLoop(MLF_SHOWONIDLE);
popupDlg.DestroyWindow();
- 如果弹出对话框永远不会被关闭和销毁,而只是隐藏,会发生什么。如果调用
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 举报,一经查实,本站将立刻删除。