键盘与鼠标事件
一、键盘事件
1. KeyDown事件、KeyUp事件
当一个对象具有焦点时,用户按下键盘按键触发KeyDown事件;释放键盘按键触发KeyUp事件。具有这两个事件的对象有窗体、命令按钮、文本框、复选框、列表框、组合框、滚动条和图片框。
事件过程的格式:
Private Sub Object_KeyDown(KeyCode As Integer,ShiftAs Integer)
Private Sub Object_KeyUp(KeyCode As Integer,ShiftAs Integer)
说明:
⑴其中的Object是窗体或控件名。
⑵事件过程有两个参数。
①KeyCode是一个整型参数,表示按键的代码。键盘上的每一个按键都有其相应的键代码,Visual Basic还为每个键代码声明了一个内部常量。例如,F1键的键代码为112,内部常量为vbKeyF1;Home键的键代码为36,内部常量为vbKeyHome。其中,键盘上的字母键和数字键的键代码与其对应的ASCII码值相同。需要注意的是,对于字母键KeyCode无法区分其大小写形式,一律返回其大写形式的ASCII码值。
②Shift是一个整型参数,表示在按下一个键时,是否同时按下了Shift、Ctrl 和Alt等控制键。此参数为1时,表示同时按下了Shift键;为2时,表示同时按下了Ctrl键;为4时,表示同时按下了Alt键。当这三个键中有不只一个键被同时按下,则Shift参数是相应数值之和。
2. KeyPress事件
支持KeyPress事件的对象有窗体、命令按钮、文本框、复选框、单选钮、列表框、组合框、滚动条和图片框。当按下键盘上的一个可打印字符键(字母、数字和符号)时,触发该事件。
事件过程的格式:Private Sub Object_KeyPress(KeyAsciiAs Integer)
说明:
⑴ Object是窗体或控件名。
⑵整型参数KeyAscii传递的是按键字符的ASCII码,即可以区分按键字符的大小写状态,按键字符的大小写状态不同返回的ASCII码也不同。
⑶ KeyPress事件仅可以接收可打印的键盘字符和为数很少的几个功能键,如Enter(回车键)和BackSpace(退格键)。如果要处理无法被KeyPress接收的其它按键,应该使用KeyDown、Keyup事件。
⑷在KeyPress事件过程中,如果改变KeyAscii的值,则会改变实际输入的字符。特殊情况下,将KeyAscii参数改变为0时可取消按键,这样对象便接收不到字符了。 另外,可以使用Chr(KeyAscii)函数将KeyAscii参数转变为一个字符。
⑸窗体中具有焦点的对象首先接收KeyPress事件。窗体只有在没有可见或有效的控件时,或KeyPreview属性被设置为True时,才能接收该事件。
二、鼠标事件
前面章节中讲到过窗体与各种控件的Click事件和DblClick事件。这两个事件不能确定用户是在对象的什么位置上单击鼠标;也不能确定用户单击的是鼠标上的哪个键(左、右、中键);更不能确定在单击鼠标时是否同时按下了键盘上的某个控制键(如Ctrl、Shift和Alt键)。要在程序中得到上面所述信息,就必须利用鼠标事件。常用的鼠标事件有MouseDown、MouseUp、MouseMove。
1. MouseDown事件、MouseUp事件、MouseMove事件
具有这三个事件的对象有窗体、图片框、图像框、命令按钮、标签、文本框、框架、复选框、单选钮和列表框。 当用户在这些对象上按下鼠标键时将触发MouseDown事件;释放鼠标键时将触发MouseUp事件;移动鼠标时将触发MouseMove事件。
事件过程的格式:
Private Sub Object_MouseDown(Button As Integer,Shift As Integer, X As Single, Y As Single)
End Sub
PrivateSub Object _MouseUp(Button As Integer, Shift As Integer, X As Single, Y AsSingle)
End Sub
PrivateSub Object _MouseMove(Button As Integer, Shift As Integer, X As Single, Y AsSingle)
End Sub
说明:其中的Object是窗体或控件对象,过程参数的取值与意义。
⑴Button参数值是一个整数,表示鼠标事件发生时按下的是哪个鼠标键。
1:左键
2:右键
4:中键。
对于MouseMove事件,事件发生时,可能同时有两个或三个鼠标键按下,这时Button参数是相应按键值的和。例如,如果MouseMove事件发生时,左键和右键都被按下,则参数Button传递的值是3。因为当移动鼠标时,可以不按下任何鼠标键,所以对于MouseMove事件,这个参数可以为0。
⑵ Shift参数
Shift参数值是一个整数,表示鼠标事件发生时,键盘上的哪些控制键同时被按下。
1:Shift键
2:Ctrl键
4:Alt键
如果同时有两个或三个控制键被按下,则Shift参数值是相应按键值的和。
⑶X参数、Y参数
X参数和Y参数都为单精度数值,表示鼠标事件发生时,鼠标指针热点所处位置的坐标。
应该注意的是,当移动鼠标时,会不断地发生MouseMove事件。在相同的距离上,鼠标移动的速度越快,产生的MouseMove事件就越少。
==========================================================
实验
用鼠标键盘事件设计小鸡吃虫的游戏
项目说明:
程序运行后,单击鼠标,小虫图像会移动到鼠标所在位置,按下键盘的上、下、左、右方向键则小鸡图像会进行相应的移动。当小鸡图像与小虫图像重合时,小虫图片消失,提示小鸡成功吃到小虫。
项目设计:
小虫移动到鼠标所在位置,这需要使用鼠标事件,才能获取鼠标当前位置信息;按上下左右键移动小鸡,这是键盘事件。然后通过小鸡和小虫图片框的位置来判断是否吃到了小虫
界面设计:现在窗体上添加两个图像框image1设置为小虫图片和image2设置为小鸡图片
程序代码:
在form_MouseDown事件中,将图片的left属性修改为鼠标所在位置坐标x,top属性修改为鼠标坐标y
键盘事件发生时,需要识别按下了哪个键,SelectCase根据键代码获取值进行选择,决定图片移动方向。
当小鸡图像与小虫图像重合时,小虫图片消失,标签显示提示小鸡成功吃到小虫
Sub form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Image1.Left = X
Image1.Top= Y
End Sub
Sub Form_KeyDown(KeyCode As Integer,Shift AsInteger)
SelectCase KeyCode
Case 37
Image2.Left= Image2.Left - 30
Case vbKeyup
Image2.Top = Image2.Top - 30
……
EndSelect
End Sub
----------------------------------------------------------------------------------------

