我有一个带有基于节点的GUI的c ++ Win32应用程序,其中当用户按下GUI中的某个键时,我使用CreateWindowEx创建了一个动态组合框。我希望用户能够在组合框Rect之外单击以使组合框消失。
为此,我目前正在销毁其DlgProc的WM_KILLFOCUS通知内的组合框(因此,其外部的任何单击都将销毁它)。但是,似乎WM_KILLFOCUS通知是在其子窗口之一获得焦点时发送的。例如,如果我单击组合框的编辑文本区域,则组合框本身将失去焦点,因为该子项获得了焦点。根据我的设置,这会导致在单击Rect中的组合框时将其删除。
如何防止这种行为?基本上,我希望能够检测到组合框或其子窗口以外的其他任何东西何时获得焦点,而不是简单地检测组合框本身是否失去焦点。
答案 0 :(得分:0)
您可以确定焦点是否从WM_KILLFOCUS处理程序内部移到了另一个控件。此消息收到
[a]接收键盘焦点的窗口的句柄。
通过其 wParam 参数。
使用CB_GETCOMBOBOXINFO消息检索COMBOBOXINFO结构,该结构包含所有起作用的窗口( hwndCombo , hwndItem 和< em> hwndList )。通过将 wParam 值与所有这些窗口句柄进行比较,可以确定焦点是移到组合框内还是移到组合框外。
尽管这回答了所提出的问题,但真正的解决方案将是处理CBN_KILLFOCUS通知。当组合框失去键盘焦点而忽略组合框控件内部的焦点更改事件时,它将被发送到控件父级。