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