【问题标题】:MFC modeless and modal dialogMFC 无模式和模式对话框
【发布时间】:2011-07-01 05:07:57
【问题描述】:
我有一个带有托盘图标的应用程序。有一个隐藏的主窗口(CMainFrm),用于处理托盘图标消息。托盘图标有一个上下文菜单:设置、帮助、退出命令。
当用户选择设置时,会显示无模式设置对话框(父级:GetDesktopWindow())。
设置对话框有一个浏览按钮,它将 MyBrowseFolderDialog 显示为模式!因此,当显示此对话框并且用户尝试使用托盘菜单中的退出命令关闭应用程序时会出现问题。
有谁知道如何通过所有这些对话框优雅地关闭应用程序?
托盘菜单 => 设置对话框(无模式)=> BrowseDialog(模式)
【问题讨论】:
标签:
mfc
dialog
modal-dialog
modeless
【解决方案1】:
将 CDialog* m_pModaldDlg 成员添加到设置对话框类,在构造函数中将其初始化为 NULL。当显示 MyBrowseFolderDialog 时,将其设置为此对话框指针:
MyBrowseFolderDialog dlg();
m_pModaldDlg = &dlg;
dlg.DoModal();
m_pModaldDlg = NULL;
在退出消息处理程序中:
如果 ( m_pModaldDlg )
m_pModaldDlg->EndDialog(0);
//关闭设置对话框
【解决方案2】:
Alex 的回答仍然不错 - 您必须将 m_pModalDlg 存储在 CMainFrm 中,以便设置和退出处理程序都可以根据需要访问它。
其他一些可能的解决方案:
设置处理程序在文件夹浏览处于活动状态时禁用退出选项
注册自定义消息 - 让退出处理程序将此消息发送到浏览文件夹(尽管您仍然需要某种窗口句柄)
我最喜欢 Alex 的回答 - 只需将指针存储在 CMainFrm 中的某处