组合框在显示列表项时如何拦截鼠标事件到表单上的任何位置来隐藏列表?

时间:2011-12-23 01:23:38

标签: .net winforms events combobox

我正在尝试使用类似于组合框的功能实现.net表单控件,但我不知道在表单上的任何位置截取鼠标事件以取消展开项目列表的正确方法。

如何在显示列表时阻止其他控件响应鼠标事件?

如何高效安全地将鼠标单击事件捕获到表单上的任何位置,以隐藏展开的列表?

2 个答案:

答案 0 :(得分:8)

只需使用ToolStripControlHostToolStripDropDown,它就像ComboBox下拉列表一样。您不必担心处理鼠标事件。

我以前用过这个:

Private Sub ShowControl(ByVal fromControl As Control, ByVal whichControl As Control)
  '\\ whichControl needs MinimumSize set:'
  whichControl.MinimumSize = whichControl.Size

  Dim toolDrop As New ToolStripDropDown()
  Dim toolHost As New ToolStripControlHost(whichControl)
  toolHost.Margin = New Padding(0)
  toolDrop.Padding = New Padding(0)
  toolDrop.Items.Add(toolHost)
  toolDrop.Show(Me, New Point(fromControl.Left, fromControl.Bottom))
End Sub

使用表单上的Button控件进行快速演示:

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
  ShowControl(Button1, New MonthCalendar)
End Sub

要回答标题中的问题,我认为 SetCaptureRelease Capture的pinvoke调用用于处理该类型的功能。

答案 1 :(得分:1)

Control.Capture

正如文档中所解释的那样,你现在“拥有”鼠标(直到其他人捕获它 - 虽然那是不好的形式)。您收到所有鼠标消息,并且可以处理不在您控制中的“关闭”以解除。