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