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