ComboBox 下拉时如何捕获鼠标?

2023-11-25

我正在尝试对 ComboBox 下拉菜单(或与此相关的其他下拉菜单,包括上下文菜单)的行为进行建模,其中当您单击其他任何位置(甚至无法聚焦的内容)时,下拉菜单会关闭。

我尝试过订阅 MouseCaptureChanged、LostFocus 和 Leave 等事件。我有一个自定义的 UserControl,它充当下拉菜单,我只想在用户单击其他任何地方时将其关闭。

这似乎是在许多控件中完成的事情,因此如果没有简单的方法来完成它,我会感到惊讶。

到目前为止,我能想到的过于复杂的方法是使用 pinvoke 和 SetCapture() 函数,或者创建 MessageFilter。如果这些是唯一的选择,我不确定哪个更好。


ComboBox 由 2 个控件构成。

  • 底座 - 不活动时可见(控制)
  • DropDownList - 在编辑模式或列表选择模式(窗口或表单)期间可见

通常情况下,底座是可见的。当用户单击 ComboBox 时,Base 控件将隐藏,而 DropDownList 控件将显示。此切换是在后台完成的,因此对于用户来说,控件似乎刚刚扩展。

您想要捕获的事件是通过 DropDownList 窗口完成的。如果您单击客户区域中的某处,DropDownList 窗口将通过其 WndProc(Message% m) 方法接收 WM_KILLFOCUS 事件。然后向父窗口(基本控件)发送带有 WParam=526318 (HIWORD(WParam)) 的 WM_COMMAND (OCM_COMMAND) 消息=8)并且 Base 控件知道他应该隐藏 DropDownList 窗口。

因此,您需要做的是实现附加的下拉窗口并捕获 WM_KILLFOCUS 事件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ComboBox 下拉时如何捕获鼠标? 的相关文章