MFC 对话框中的父通知

Posted

技术标签:

【中文标题】MFC 对话框中的父通知【英文标题】:Parent notification in MFC Dialog 【发布时间】:2008-11-14 10:03:54 【问题描述】:

我有第一个对话框,上面有一个简单的按钮,单击按钮时,使用 CDialog::Create(IDD,this) 创建了第二个对话框。我希望在第二个对话框被销毁时通知父级,但不向第二个对话框添加任何代码,即不在 OnDestroy 方法中添加 m_pParent->Notify() 行。 我在父对话框中尝试了 OnParentNotify、PreTranslateMessage、SubclassWindow,但没有成功。我没有在第二个对话框中使用 WS_CHILD 样式。有什么想法吗?

完成:事实上,我有一个 ComboBox 派生类(但问题与按钮相同),我正在显示一个无模式对话框而不是显示列表框。但我希望控件尽可能通用,以便可以使用任何无模式对话框。这就是我不想在第二个对话框中添加特定通知的原因。如果我有义务,我会使用这个技巧,但我要求一个更通用的解决方案。 PreTranslateMessage 只捕获 WM_PAINT、WM_NCMOUSELEAVE 和 WM_NCMOUSEMOVE。

【问题讨论】:

好的,但你仍然没有告诉我们应该如何销毁无模式对话框。 如果您找到答案,请标记为这样。作为提问者,您有责任这样做。 【参考方案1】:

使用基类并让您的父级仅通过基类引用无模式子级。在基础 PostNcDestroy 中将其发布给父级。

让父母对所有消息进行大量过滤/监视是没有意义的。在一个基类中实现行为确实很有意义,您希望这些行为对于您可能拥有的无模式孩子的所有不同未来风格都有共同点。

【讨论】:

感谢 ajryan,它终于使用 OnActivate/PreTranslateMessage(WM_NCMOUSEMOVE) 的组合工作了。我会听从你对基类的建议,因为没有它,它在父级上可能会非常复杂。谢谢。【参考方案2】:

由于 dialog2 不是 dialog1 的子级,因此未调用 OnParentNotify()。

PreTranslateMessage() 在这里应该有所帮助(尽管我不喜欢这个项目符号)。诀窍是无模式对话框在关闭时不会自行销毁。如果您希望对话框终止,它必须在关闭时调用 DestroyWindow(),例如在 OnCancel() 覆盖中。

当然,首先想到的就是你为什么不想在无模式对话框代码中添加自定义通知。

编辑:另一种方法是安装一个消息挂钩(对于当前线程,而不是整个系统!)。这将帮助您捕获与 dialog1 相同的线程关联的所有窗口的所有消息。见SetWindowsHookEx()

【讨论】:

事实上,我有一个 ComboBox 派生类,我正在显示一个无模式对话框而不是显示列表框。但我希望控件尽可能通用,以便可以使用任何无模式对话框。 PreTranslateMessage 仅捕获 WM_PAINT、WM_NCMOUSELEAVE 和 WM_NCMOUSEMOVE。 我建议你编辑你的问题来解释你的场景。您的无模式对话框是如何关闭和销毁的?失去焦点应该足够了。但是,根据您的情况,您也不希望将该代码放在模型对话框中。查看我关于钩子的编辑 感谢您的帮助 Serge,它终于使用 OnActivate/PreTranslateMessage(WM_NCMOUSEMOVE) 的组合工作了。但是按照 ajryan 的建议,我将为我的无模式对话框使用基类,因为我最初的想法不是非常实用:这种类型的组合框很多,父管理会太复杂。【参考方案3】:

将主父表单事件发布到消息队列怎么样?

【讨论】:

以上是关于MFC 对话框中的父通知的主要内容,如果未能解决你的问题,请参考以下文章

在 MFC 中不断增加进度条

在 MFC 中配置新文档

MFC中TAB控件使用问题

mfc 从另一个对话框更改对话框的光标

Windows MFC 对话框程序

mfc中让编辑框透明为啥总显示黑色背景的编辑框啊?