第12章键盘与鼠标事件过程
Visual Basic应用程序能够响应多种键盘事件和鼠标事件。例如,窗体、图片框与图像控件都能检测鼠标指针的位置,并可判定其左、右键是否已经按下,还能响应鼠标按钮与Shift、Ctrl或Alt键的各种组合。利用键盘事件可以编程响应多种键盘操作,也可以解释、处理ASCII字符。Visual Basic应用程序还支持大多数控件及OLE的拖放功能,可用控件的Drag方法连同某些属性和事件宋实现控件的拖放操作。OLE的拖放使应用程序的数据交换功能大大增强。
本章将对键盘和鼠标事件进行详细讲解,使读者掌握利用键盘和鼠标进行编程的基本技术。
12.1键盘事件
键盘事件是用户与程序之间交互操作中的主要元素之—。单击鼠标和按下按键都可以触发事件,而且还提供进行数据输入的手段以及在窗口和菜单中移动的基本形式。
键盘事件有三种,即KeyPress、KeyUp和KeyDown事件。窗体和可接受键盘输入的控件(
如文本框TextBox、命令按钮CommandButton、图片框PictureBox、组合框ComboBox等)都可识别这些事件。值得注意的是,只有获得焦点的对象才能够接受键盘事件。对于窗体,只有成为活动窗体并且窗体中的任何控件均未获得焦点时,才会产生窗体的键盘事件。窗体中任何控件已经获得焦点时,会产生控件的键盘事件。
12.1.1 KeyPress事件
当用户按下键盘上的某个键时,将触发KeyPress事件。该事件可以用于窗体和大部分标准控件,严格来说,当按下某个键时,所触发的是具有输入焦点(FOCUS)的那个控件的KeyPress事件。在某一时刻,输入焦点只能位于某一个控件上,如果窗体上没有可见或有效的控件,则输入焦点位于窗体上。当一个控件或窗体拥有输入焦点时,该控件或窗体将接受从键盘上输入的信息。例如,假定一个文本框拥有输入焦点,则从键盘上输入的任何字符都将在该文本框上回显。
KeyPress事件过程的一般格式是:
Private Sub对象名KeyPress(KeyAscii as Integer)
事件过程
End Sub
如果接受KeyPress事件的对象为控件数组,对应的事件过程的格式为:
Private Sub 对象名_KeyPress(Index as Integer,KeyAscii AS Integer)
事件过程
End Sub
其中,“Index”是数组元素的下标。
说明:
(1)“对象名”是接受键盘事件的对象的名称,如文本框、窗体等。
(2)KeyAscii为KeyPress事件过程的参数,返回用户所按键的ASCII值。如按下小写字母“a”时返回97,按下大写字母“A”时则返回65。相应的小写字母ASCII值比大写字母大32。
0~9的ASCII值为48~57之间。在KeyPress事件过程中,将KeyAscii的值改为0,可以取消该字符和这次按键操作。
注意:在默认状态下控件的键盘事件优于窗体的键盘事件,冈此在发生键盘事件时,总是先激活控件的键盘事件。如果希望窗体先接受键盘事件,则必须把窗体的KeyPreviev属性设置为True,否则不能激活窗体的键盘事件。这里所说的键盘事件包括KeyPress、KeyDown和KeyUp。
[例12-1]将输入到文本框中的所有字符都强制转换为大写字符。
问题分析:可使用KeyPress事件将输入的每一个字符转换为大写。
程序代码:
Private Sub Text1_KeyPress(KeyAscii As Integer)
KeyAscii=Asc(UCase(Chr(KeyAscii)))
End Sub
这里通过设置KeyAscii参数,返回转换后的大写字符的ASCII码值。Chr函数将ASCI:码转换成对应的字符,UCase函数将字符转换为大写,Asc函数将字符转换为ASCII码。
[例12-2]限制在文本框中输入的字符为数值。
问题分析:可使用KeyPress事件将输入的每一个字符进行判断,当用户按下的不是04之间的键时,使用KeyPress事件给用户进行提示,并使输入的值不在文本框中显示出来。
Private Sub Text1_KeyPress(KeyAsciiAs Integer)
If KeyAscii<48 or KeyAscii>57 Then '按键是不是0~9
MsgBox "数字非法!只能输入数字字符。"
KeyAscii=0'撤销该字符,也不显示
End If
End Sub
12.1.2 KeyDown事件和KeyUp事件
KeyDown事件在按下键盘时触发,KeyUp事件则在释放键盘时触发。KeyDown事件和KeyUp事件提供了最低级的键盘响应,可以报告键盘的物理状态。按下某个键时也会触发KeyPress事件,但与KeyDown事件不同的是,KeyDown事件和KeyUp事件返回的是键盘的直接状态,即返回的是所按的“键”,而KeyPess返回的是“字符”的ASCII码。例如,输入大写“A”和小写“a”时,KeyDown事件获得“A”的ASCII码,在输入小写“a”时,KeyDown事件获得与“A”相同的ASCII码,即KeyDown事件不区分大小写,而KeyPress事件将字母的大小写作为两个不同的ASCII字符处理。
KeyDown事件过程的—般格式是:
Private Sub对象名_KeyDown(KeyCode As Integer,Shift As Integer)
事件过程
End Sub
KeyUp事件过程的一般格式是:
Private Sub对象名KeyUp(KeyCode As Integer,Shift As Integer)
事件过程
End Sub
说明:
(1)“对象名”是窗体和能接受键盘事件的控件的名称。
(2)参数KeyCode是所按键的扫描码,即大写字母对应的ASCII值。
(3)参数Shift是描述Shift、Ctrl和Alt键的状态的一个整数,Shift参数是一个位域,由3个二进制位组成,最低位(位0)表示Shift键的状态,中间位(位1)表示Ctrl键的状态,最高位(位2)表示Alt键的状态。Visual Basic定义了三个位屏蔽常数vbShiftMask、vbCtrlMask、
vbAltMask,用来测试三个键的组合。表12-1列出了Shift参数的取值。
表12-1Shift参数的取值及含义
十进制数
二进制数
VB常数
ShiftCtrlAlt键的状态
0
000
3个键都没有按下
1
001
vbShinMask
只按下Shift
2
010
vbCtrlMask
只按下Ctrl
3
011
vbShinMask+vbCtrlMask
同时按下ShiftCtrl
4
100
vbAltMask
只按下Alt
mousemove是什么键
5
101
vbShinMask+vbAltMask
同时按下ShiftAlt
6
110
vbCtrlMask+vbAltMask
同时按下CtrlAlt
7
111
vbShinMask+vbCtrlMask+vbAltMask
同时按下3个键
[例12-3]判断是否按下了某个键。
以下程序代码可判断是否按下了“A”键:
Private Sub Form_KeyDown(KeyCode As Integer,Shift As Integer)
If KeyCode=vbKeyAThen MsgBox "You Pressed the A key"
End Sub
请读者用KeyPress事件过程实现类似功能,考虑一下有什么不同。
[例12-4]上档符号键的监测。
问题分析:要监测是否按下了键盘上的上档符号键,只使用KeyCode是不够的,需要使用Shift参数。下面的程序可判断是否按下了“*”键:
Private Sub Form_KeyDown(KeyCode As Integer,Shift As Integer)
If KeyCode=vbKey8 And Shift=1 Then
MsgBox "您按下了*键"
End If
End Sub
利用位屏蔽常数和位运算符AND可以根据Shift的值确定是否按下了某个特殊键。
[例12-5]判断是否按下了Alt键。编程实现按下Alt+F6时关闭窗体。
下面的程序用来监测是否按下了Alt+F6组合键:
Private Sub Form_KeyDown(KeyCode As Integer,Shift As Integer)
If KeyCode=vbKeyF6 And Shift=4 Then
Unload Me
End If
End Sub
KeyPress事件与KeyDown/KeyUp事件的区别:
(1)KeyPress事件返回的是字符的ASCII码,而KeyDown/KeyUp返回的是键的代码。例如,按“A”和“a”返回的是同一个KeyCode值,因为它们是同一个键:而对KeyPress来说,按“A”和“a”得到的ASCII码是不一样的。在KeyDown/KeyUp事件中,为判断按下的是大写字母还是小写字母,需配合使用Shift参数。
(2)KeyPress事件识别的击键范围比KeyDown/KeyUp事件小。例如,按键盘上的Fll-F12功能键和定位键不能触发KeyPress事件,但是可触发KeyDown/KeyUp事件。
12.2 鼠标事件
在Windows应用程序中,与鼠标操作相关的事件较多,除了常用的单击事件Click、双击事件DblClick外,有些程序还需要对鼠标指针的位置和状态变化作出响应,因此需要使用鼠标事件MouseDown、MouseUp和MouseMove。
12.2.1鼠标事件
鼠标事件是由鼠标动作而引起的。三个基本的鼠标事件是:
●MouseDown事件:按下鼠标按钮时触发。
●MouseUp事件:释放鼠标时触发。
●MouseMove事件:移动鼠标光标时触发。
鼠标事件过程的一般格式是:
Private Sub对象名—事件名(Button As Integer,Shift As Integer,X As Single,Y As Single)
说明:
(1)“对象名”可以是窗体及能接受鼠标事件的大多数控件。当鼠标指针位于窗体上时,窗体将识别鼠标事件;当鼠标指针在控件上时,控件将识别鼠标事件。如果按下鼠标按钮个放,则即使指针已移离对象,对象仍将继续识别所有鼠标事件,直到用户释放按钮为止。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。