如何在 MFC 自定义控件类中挂钩控件关闭
Posted
技术标签:
【中文标题】如何在 MFC 自定义控件类中挂钩控件关闭【英文标题】:how to hook control closing in an MFC custom control class 【发布时间】:2009-12-11 19:59:08 【问题描述】:我有兴趣分配指针,将它们存储在组合框控件的 LPARAM 数据中,并让该控件在销毁时负责删除这些指针。
由于我在 MFC 中工作,我可以继承 CComboBoxEx,并添加消息处理程序或虚拟成员函数。
问题是:Win32 / MFC 是否可以使用这种模式?
基本上,如何通知控件其对应的 HWND 正在被销毁?
WM_DESTROY 的文档:
WM_DESTROY 消息在窗口被销毁时发送。 在窗口从屏幕上移除后,它被发送到正在销毁的窗口的窗口过程。 (强调我的)
不幸的是,我模糊的回忆是,这意味着 OnDestroy() 为时已晚,无法处理任何需要与相关 HWND 交互的事情,不是吗?
我可以在 OnDestroy() 期间查询 comboboxex 中的元素吗?是否有另一个我可以使用的钩子“就在我的窗口/控件被破坏之前(而不是之后!)?”
我想知道我是否为我的子类覆盖了 CBEM_DELETEITEM 并强制它删除 LPARAM 数据。销毁组合框时是否所有项目都明确删除?如果是这样,它们是否都通过该消息被销毁(控件是否将该消息发送给它自己?)
【问题讨论】:
请注意:我知道我可以将 shared_ptr 或 scoped_ptr 的向量存储在对话框本身中,在这种情况下,可以保证删除指针。但是,为了做到这一点,我在这个额外的空间中同步添加和删除。 【参考方案1】:在 OnDestroy() 期间,您的窗口仍然有效 - 如果不是,您的窗口根本不会收到消息,因为它是通过标准 Windows 消息传递系统发送的。
你走在正确的轨道上——这种类型的场景就是 OnDestroy() 的用途。
【讨论】:
是的,仅仅因为窗口被从屏幕上移除(正如 Mordachai 强调的那样,WM_DESTROY 就是这种情况)并不意味着 HWND 不再有效。 谢谢 - 确实,挂钩 WM_DESTROY 确实可以正常工作。【参考方案2】:来自MSDN:
OnDestroy 在 CWnd 被销毁时首先被调用,然后在 CWnd 的子窗口被销毁时被调用。可以假设在 OnDestroy 运行时所有子窗口仍然存在。
【讨论】:
以上是关于如何在 MFC 自定义控件类中挂钩控件关闭的主要内容,如果未能解决你的问题,请参考以下文章
MFC:如何将自定义控件包含到 Visual Studio 的工具箱中