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