【问题标题】:Win32: Combobox loses focus when clicking its child windowWin32:单击其子窗口时,组合框失去焦点
【发布时间】:2019-03-15 07:06:17
【问题描述】:

我有一个带有基于节点的 GUI 的 c++ Win32 应用程序,当用户在 GUI 中按下某个键时,我使用 CreateWindowEx 创建一个动态组合框。我希望用户能够在组合框 Rect 之外单击以使组合框消失。

为此,我目前正在销毁其 DlgProc 的 WM_KILLFOCUS 通知内的组合框(因此在它之外的任何点击都会破坏它)。但是,似乎只要其子窗口之一获得焦点,就会发送 WM_KILLFOCUS 通知。例如,如果我单击组合框的编辑文本区域,组合框本身会失去焦点,因为该子项获得焦点。鉴于我的设置,这会导致组合框在其矩形内单击时被删除。

如何防止这种行为?基本上,我希望能够检测组合框或其子窗口以外的任何东西何时获得焦点,而不是简单地检测组合框本身是否失去焦点。

【问题讨论】:

  • 您应该在问题中添加图片。很难理解你真正想要什么。 “删除组合框”是什么意思?删除组合框的下拉部分或删除整个组合框控件?通常你不需要为组合框做任何特别的事情,它们只是“开箱即用”。
  • 我编辑了这篇文章。删除是指通过调用 DestroyWindow 来销毁整个组合框 HWND。
  • 我认为在这里使用 WM_KILLFOCUS 不是正确的方法。

标签: c++ winapi combobox


【解决方案1】:

您可以确定焦点是否从WM_KILLFOCUS 处理程序内部移动到不同的控件。此消息接收

[a] 接收键盘焦点的窗口句柄。

通过它的 wParam 参数。

使用CB_GETCOMBOBOXINFO 消息检索COMBOBOXINFO 结构,该结构包含所有贡献窗口的窗口句柄(hwndCombohwndItemhwndList)。将 wParam 值与所有这些窗口句柄进行比较,您可以确定焦点是移动到组合框内部还是外部。


虽然这回答了所提出的问题,但真正的解决方案是处理 CBN_KILLFOCUS 通知。当组合框失去键盘焦点时将其发送给控件父级,忽略组合框控件内部的焦点更改事件。

【讨论】:

  • 这将引入后续问题。一旦焦点位于组合框内的编辑框中,如果焦点移动到组合框外的位置,组合框 HWND 本身将不会获得WM_KILLFOCUS。听起来 OP 需要对组合框组成窗口进行子类化,以便跟踪离开整个窗口集的焦点。
猜你喜欢
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
相关资源
最近更新 更多