我有一个带有简单按钮的第一个对话框,在单击按钮时,使用CDialog :: Create(IDD,this)创建第二个对话框。我希望在销毁第二个对话框时通知父级,但不向第二个对话框添加任何代码,即不在OnDestroy方法中添加m_pParent-> Notify()行。 我在父对话框中尝试过OnParentNotify,PreTranslateMessage,SubclassWindow但没有成功。我没有将WS_CHILD样式用于第二个对话框。有什么想法吗?
完成:事实上,我有一个ComboBox派生类(但问题与按钮相同),我正在显示一个无模式Dialog,而不是显示列表框。但我希望控件尽可能通用,以便可以使用任何无模式对话框。这就是我不想在第二个对话框中添加特定通知的原因。如果我有义务,我将使用这个技巧,但我要求更通用的解决方案。 PreTranslateMessage仅捕获WM_PAINT,WM_NCMOUSELEAVE和WM_NCMOUSEMOVE。
答案 0 :(得分:2)
使用基类并让您的父级仅通过基类引用无模式子级。在PostNcDestroy的基础上,它将它发布到父级。
让父母对所有邮件进行一堆过滤/间谍是没有意义的。在基类中实现行为是有意义的,您希望这些行为对于您可能拥有的无模式子项的所有不同未来风格都是通用的。
答案 1 :(得分:1)
由于dialog2不是dialog1的子节点,因此未调用OnParentNotify()。
PreTranslateMessage()应该在这里提供帮助(虽然我不喜欢这个子弹)。诀窍是无模式对话框在关闭时不会破坏它自己。如果你想让对话框死掉,它必须在关闭时调用DestroyWindow(),例如在OnCancel()覆盖中。
当然,首先想到的是想知道为什么你不想在无模式对话框代码中添加自定义通知。
编辑:另一种方法是安装消息钩子(对于当前线程,而不是整个系统!)。这将帮助您捕获与dialog1相同的线程关联的所有窗口的所有消息。见SetWindowsHookEx()
答案 2 :(得分:0)
如何将主要父表单事件发布到消息队列?