大多数 Windows 窗体程序通过处理鼠标事件来处理鼠标输入。 本文概述了鼠标事件,包括有关何时使用每个事件和为每个事件提供的数据的详细信息。
响应鼠标输入的主要方法是处理鼠标事件。 下表显示了鼠标事件并说明了这些事件的引发时间。
鼠标事件 | 说明 |
---|---|
Click | 此事件在释放鼠标按钮时发生,通常在?MouseUp?事件之前。 此事件的处理程序接收类型为?EventArgs?的参数。 如果只需确定何时发生单击,处理此事件。 |
MouseClick | 此事件在用户使用鼠标单击控件时发生。 此事件的处理程序接收类型为?MouseEventArgs?的参数。 如果需要在发生单击时获取有关鼠标的信息,处理此事件。 |
DoubleClick | 此事件在双击控件时发生。 此事件的处理程序接收类型为?EventArgs?的参数。 如果只需确定何时发生双击,处理此事件。 |
MouseDoubleClick | 此事件在用户使用鼠标双击控件时发生。 此事件的处理程序接收类型为?MouseEventArgs?的参数。 如果需要在发生双击时获取有关鼠标的信息,处理此事件。 |
MouseDown | 当鼠标指针位于控件上方并且用户按下鼠标按钮时,会发生此事件。 此事件的处理程序接收类型为?MouseEventArgs?的参数。 |
MouseEnter | 当鼠标指针进入控件的边框或工作区时(具体取决于控件的类型),会发生此事件。 此事件的处理程序接收类型为?EventArgs?的参数。 |
MouseHover | 此事件在鼠标指针停留在控件上时发生。 此事件的处理程序接收类型为?EventArgs?的参数。 |
MouseLeave | 当鼠标指针离开控件的边框或工作区时(具体取决于控件的类型),会发生此事件。 此事件的处理程序接收类型为?EventArgs?的参数。 |
MouseMove | 当鼠标指针发生移动但仍位于控件上方时,会发生此事件。 此事件的处理程序接收类型为?MouseEventArgs?的参数。 |
MouseUp | 当鼠标指针位于控件上方,并且用户释放鼠标按钮时,会发生此事件。 此事件的处理程序接收类型为?MouseEventArgs?的参数。 |
MouseWheel | 当用户滚动鼠标滚轮并且控件有焦点时,会发生此事件。 此事件的处理程序接收类型为?MouseEventArgs?的参数。 可以使用?MouseEventArgs?的?Delta?属性来确定鼠标滚动的距离。 |
MouseEventArgs?将发送到与单击鼠标按钮和跟踪鼠标移动相关的鼠标事件处理程序。?MouseEventArgs?提供有关当前鼠标状态的信息,包括鼠标指针在客户端坐标中的位置、按下的鼠标按钮是哪一个以及是否已经滚动鼠标滚轮。 几个鼠标事件(例如在鼠标指针进入或离开控件边界时引发的事件)会向事件处理程序发送?EventArgs,但不提供详细信息。
如果想要知道鼠标按钮当前的状态或鼠标指针的位置,并且希望避免处理鼠标事件,还可以使用?Control?类的?MouseButtons?和?MousePosition?属性。?MouseButtons?返回有关当前按下哪些鼠标按钮的信息。?MousePosition?返回鼠标指针的屏幕坐标,等同于由?Position?返回的值。
由于某些鼠标位置信息以客户端坐标提供,另一些以屏幕坐标提供,因此可能需要将某个点的位置信息从一个坐标系统转换到另一个坐标系统。 通过使用?Control?类提供的?PointToClient?和?PointToScreen?方法可轻松完成此操作。
如果想要以正确的顺序处理鼠标单击事件,则需要了解在 Windows 窗体控件中引发的单击事件的顺序。 当按下任何受支持的鼠标按钮并释放时,所有 Windows 窗体控件都将以相同的顺序引发单击事件,下表中注明的个别控件除外。 下表显示单击鼠标按钮所引发事件的顺序:
下面显示双击鼠标按钮所引发事件的顺序:
MouseDown?事件。
Click?事件。
MouseClick?事件。
MouseUp?事件。
MouseDown?事件。
DoubleClick?事件。
此顺序可能不同,具体取决于相关控件的?StandardDoubleClick?样式位是否设置为?true
。?
MouseDoubleClick?事件。
MouseUp?事件。
以下控件不符合标准鼠标单击事件行为:
对于?ComboBox?控件,如果用户单击编辑字段、按钮或列表中的某个项,将发生稍后详细说明的事件行为。
TextBox、RichTextBox、ListBox、MaskedTextBox?和?CheckedListBox?控件
当用户单击这些控件内的任意位置时,将发生稍后详细说明的事件行为。
ListView?控件
仅当用户单击?ListView?控件中的项时,才会发生稍后详细说明的事件行为。 单击该控件上其他任意位置不会引发任何事件。 除了稍后说明的事件外,还有?BeforeLabelEdit?和?AfterLabelEdit?事件,如果想要对?ListView?控件进行验证,你可能会对这些事件感兴趣。
TreeView?控件
仅当用户单击?TreeView?控件中的项或项的右侧时,才会发生稍后详细说明的事件行为。 单击该控件上其他任意位置不会引发任何事件。 除了稍后说明的事件,还有?BeforeCheck、BeforeSelect、BeforeLabelEdit、AfterSelect、AfterCheck?和?AfterLabelEdit?事件,如果想要对?TreeView?控件进行验证,你可能会对这些事件感兴趣。
切换控件(如派生自?ButtonBase?类的控件)具有独特的绘制行为和鼠标单击事件:
用户按下鼠标按钮。
控件以按下状态进行绘制。
引发?MouseDown?事件。
用户释放鼠标按钮。
控件以引发状态进行绘制。
引发?Click?事件。
引发?MouseClick?事件。
引发?MouseUp?事件。
如果用户在鼠标按钮处于按下状态时将指针移出切换控件(例如在鼠标按下时将鼠标从?Button?控件移出),那么切换控件将以引发状态进行绘制,并且只发生?MouseUp?事件。 在这种情况下,将不会发生?Click?或?MouseClick?事件。