Windows程序设计与架构
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.5 如何操作键盘和鼠标

1.5.1 使用键盘事件

大多数Windows窗体程序都通过处理键盘事件来处理键盘输入。本节将对键盘事件进行概述,其中包括关于何时使用每个事件及提供给每个事件的数据的详细信息。

当用户按下键盘按键时,Windows窗体提供两个事件,而当用户松开键盘按键时,Windows窗体提供一个事件,如下所示:

  • KeyDown事件发生一次。
  • KeyPress事件,当用户按住同一个键时,该事件可以发生多次。
  • 当用户松开按键时,KeyUp事件发生一次。

当用户按键时,Windows窗体根据键盘消息指定的是字符键还是物理键来确定要引发的事件。

下表对这三个键盘事件进行了说明。

1.5.2 使用鼠标事件

处理鼠标输入时,经常需要知道鼠标指针的位置和鼠标按键的状态。本节将详细介绍如何从鼠标事件获取这种信息,并解释在Windows窗体控件中鼠标按键单击事件的引发顺序。

将MouseEventArgs发送到与单击鼠标按键和跟踪鼠标移动相关的鼠标事件的处理方法。MouseEventArgs提供有关鼠标当前状态的信息,包括鼠标指针在工作区坐标中的位置、按下了哪个鼠标按键,以及是否滚动了鼠标轮。一些鼠标事件(例如,在鼠标指针进入或离开控件的边框时只进行通知的那些鼠标事件)只向事件处理程序发送EventArgs,而不发送进一步的信息。

如果想要知道鼠标按键的当前状态或鼠标指针的位置,而又不想处理鼠标事件,则还可以使用Control类的MouseButtons和MousePosition属性。MouseButtons返回当前按下的鼠标按钮的有关信息。MousePosition返回鼠标指针的屏幕坐标,该值等于Position返回的值。

1.屏幕坐标和工作区坐标之间的转换

由于某些鼠标位置信息使用的是工作区坐标,而某些使用的是屏幕坐标,因此,可能需要将某个点的坐标从一种坐标系转换为另一种坐标系。通过使用Control类中的PointToClient和PointToScreen方法,可以轻松完成此操作。

2.标准单击事件行为

如果要以正确顺序处理鼠标按键单击事件,需要知道在Windows窗体控件中单击事件的引发顺序。除对下面列表中的个别控件另有说明外,当按下并释放鼠标按键(无论哪个按键)时,所有Windows窗体控件都会以相同顺序引发单击事件。下面列出显示单击一次鼠标按钮所引发事件的顺序。

(1)MouseDown事件。

(2)Click事件。

(3)MouseClick事件。

(4)MouseUp事件。

下面是双击鼠标按键所引发事件的顺序。

(1)MouseDown事件。

(2)Click事件。

(3)MouseClick事件。

(4)MouseUp事件。

(5)MouseDown事件。

(6)DoubleClick事件(这可能有所不同,具体取决于相关控件是否将StandardDoubleClick样式位设为true。有关如何设置ControlStyles位的更多信息,请参见SetStyle方法)。

(7)MouseDoubleClick事件。

(8)MouseUp事件。

3.个别控件

下面的控件不符合标准的鼠标单击事件行为。

(1)Button、CheckBox、ComboBox和RadioButton控件

注意:对于ComboBox控件,如果用户单击编辑字段、按钮或列表中的项,则发生下面的事件行为。

  • 单击左键:Click、MouseClick。
  • 单击右键:不引发任何单击事件。
  • 双击左键:Click、MouseClick;Click、MouseClick。
  • 双击右键:不引发任何单击事件。

(2)TextBox、RichTextBox、ListBox、MaskedTextBox和CheckedListBox控件

注意:当用户单击这些控件内的任何位置时,发生下面的事件行为。

  • 单击左键:Click、MouseClick。
  • 单击右键:不引发任何单击事件。
  • 双击左键:Click、MouseClick、DoubleClick,MouseDoubleClick。
  • 双击右键:不引发任何单击事件。

(3)ListView控件

注意:只有当用户单击ListView控件中的项时,才会发生下面的事件行为,单击控件上的任何其他位置都不会引发任何事件。除下面所描述的事件外,还有BeforeLabelEdit和AfterLabelEdit事件,如果要对ListView控件进行验证,则可能会用到这两个事件。

  • 单击左键:Click、MouseClick。
  • 单击右键:Click、MouseClick。
  • 双击左键:Click、MouseClick;DoubleClick、MouseDoubleClick。
  • 双击右键:Click、MouseClick;DoubleClick、MouseDoubleClick。

(4)TreeView控件

注意:只有当用户在TreeView控件中单击项本身或项的右侧时,才会发生下面的事件行为,单击控件上的任何其他位置都不会引发任何事件。除下面描述的事件外,还有BeforeCheck、BeforeSelect、BeforeLabelEdit、AfterSelect、AfterCheck和AfterLabelEdit事件,如果要对TreeView控件进行验证,则可能会用到这些事件。

  • 单击左键:Click、MouseClick。
  • 单击右键:Click、MouseClick。
  • 双击左键:Click、MouseClick;DoubleClick、MouseDoubleClick。
  • 双击右键:Click、MouseClick;DoubleClick、MouseDoubleClick。

1.5.3 切换控件的绘制行为

切换控件(如从ButtonBase类派生的控件)具有以下与鼠标单击事件相结合的独特绘制行为。

  • 用户按下鼠标按键。
  • 该控件以按下状态进行绘制。
  • 引发MouseDown事件。
  • 用户释放鼠标按键。
  • 该控件以凸起状态进行绘制。
  • 引发Click事件。
  • 引发MouseClick事件。
  • 引发MouseUp事件。