VB学习资料第十二章 响应鼠标和键盘事件.docx
《VB学习资料第十二章 响应鼠标和键盘事件.docx》由会员分享,可在线阅读,更多相关《VB学习资料第十二章 响应鼠标和键盘事件.docx(9页珍藏版)》请在冰点文库上搜索。
![VB学习资料第十二章 响应鼠标和键盘事件.docx](https://file1.bingdoc.com/fileroot1/2023-6/20/964ebfc6-bd3e-4c79-9d36-c53aa2aed9dc/964ebfc6-bd3e-4c79-9d36-c53aa2aed9dc1.gif)
VB学习资料第十二章响应鼠标和键盘事件
12.1.1鼠标事件过程
MouseMove、MouseDown、MouseUp三个事件的过程的语法格式如下:
SubObject_MouseMove(ButtonAsInteger,ShiftAsInteger,_XAsSingle,YAsSingle)
SubObject_MouseDown(ButtonAsInteger,ShiftAsInteger,_XAsSingle,YAsSingle)
SubObject_MouseUp(ButtonAsInteger,ShiftAsInteger,_XAsSingle,YAsSingle)
其中:
◆Object是可选的一个对象表达式,可以是窗体对象和大多数可视控件。
◆Button参数是表示按下或松开鼠标哪个按钮。
图12-1表示了参数Button的值。
图12-1参数Button值
参数Button的值对应的功能如表12-1所示。
表12-1参数Button的说明
参数(Button)
值
说明
vbLeftButton
1
左按钮被按下
vbRightButton
2
右按钮被按下
vbMiddleButton
4
中间按钮被按下
◆通过Shift参数表示在Button参数指定的按钮被按下或者被松开的情况下键盘的Shift、Ctrl和Alt键的状态,图12-2表示了Shift参数的值,Ctrl、Shift、Alt三键组合使用情况如表12-2所示。
图12-2Shift参数的值
表12-2Shift参数的值
二进制值
十进制值
系统常数
意义
000
0
未按下任何键
011
3
vbShiftMask+vbCtrlMask
同时按下Shift
和Ctrl键
101
5
vbShiftMask+vbAltlMask
同时按下Shift
和Alt键
110
6
vbCtrlMask+vbAltMask
同时按下Ctrl
和Alt键
111
7
vbCtrlMask+vbAltMask+vbShiftMask
同时按下Ctrl、Alt
和Shift键
◆参数X、Y
X,Y鼠标指针的位置,通过X和Y参数返回一个指定鼠标指针当前位置的数,X和Y的值是使用该对象的坐标系统表示鼠标指针当前位置。
注意:
鼠标事件被用来识别和响应各种鼠标状态,并把这些状态看作独立的事件,在按下鼠标按钮并释放时,Click事件只能把此过程识别为一个单一的单击操作。
鼠标事件能够区分各鼠标按钮及键盘的SHIFT、CTRL、ALT键的状态。
【例】使用MouseDown和MouseMove事件,编写一个在窗体上用鼠标绘图的简单程序(随着鼠标的移动,画线越来越宽)。
OptionExplicit
DimsngDrawWidthAsSingle'模块级变量,保存线条宽度
PrivateSubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,_
XAsSingle,YAsSingle)
IfButton=1Then'如果按下左键
CurrentX=X:
CurrentY=Y'设置画线起点
sngDrawWidth=1'设置线条初始宽度
DrawWidth=sngDrawWidth
EndIf
EndSub
PrivateSubForm_MouseMove(ButtonAsInteger,ShiftAsInteger,_XAsSingle,YAsSingle)
DimlngDrawColorAsLong
IfButton=1Then'使用不同颜色
IfShift=1Then
lngDrawColor=RGB(255,0,0)
ElseIfShift=2Then
lngDrawColor=vbGreen
ElseIfShift=4Then
lngDrawColor=&HFF0000
EndIf
sngDrawWidth=sngDrawWidth+0.1'加宽线条
DrawWidth=sngDrawWidth
Line-(X,Y),lngDrawColor'画线
EndIf
EndSub
12.1.2拖放
在运行时拖动控件,通常情况下并不能自动改变控件位置,这就必须使用VisualBasic的拖放功能,通过编程,才能实现在运行时拖动控件并改变其位置。
把按下鼠标按钮并移动控件的操作称为拖动,把释放按钮的操作称为放下。
一、DragMode属性
功能:
返回或设置一个值,确定在拖放操作中所用的是手动还是自动拖动方式。
格式:
object.DragMode[=number]
其中:
object:
为支持DragMode属性的一个对象。
Number:
取0时,启动人工拖放模式;取1时,启动自动拖放模式。
注意:
当DragMode属性设置为1(自动方式)时,控件不能正常响应鼠标事件。
当拖动控件时,该控件不能识别用户发出的其它鼠标或键盘事件(KeyDown、KeyPress或KeyUp,MouseDown、MouseMove或MouseUp)。
二、DragIcon属性
功能:
返回或设置图标,它将在拖放操作中作为指针显示。
格式:
object.DragIcon[=icon]
其中:
object:
为支持DragMode属性的一个对象。
Icon:
为任何返回图标的程序引用,例如引用窗体图标(Form1.Icon),引用另外控件的DragIcon属性(Text1.DragIcon),或是LoadPictur函数。
三、DragDrop事件
在一个完整的拖放动作(即将一个控件拖动到一个对象上,并释放鼠标按钮)完成,或使用Drag方法,并将其action参数被设置为2(Drop)时,该事件发生。
说明:
◆DragDrop事件过程用来控制在一个拖动操作完成时将会发生的情况。
例如,可将源控件移到一个新的位置或将一个文件从一个位置复制到另一个位置。
注意:
应使用DragMode属性和Drag方法来指定开始拖动的方法。
一旦开始拖动,可使用DragOver事件过程来处理位于DragDrop事件前面的事件。
【例】在窗体上放置一个标签框(lblSource),两个文本框,一个作为源文本框(txtSource),一个作为目标文本框(txtTarget),实现从标签框和源文本框到目标文本框的拖放功能。
程序界面如图12-7所示。
图12-7
程序代码如下:
PrivateSublblSource_Click()
lblSource.Drag
EndSub
PrivateSubtxtSource_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
IfShift=2Then
txtSource.Drag1
EndIf
EndSub
PrivateSubtxtTarget_DragDrop(SourceAsControl,XAsSingle,YAsSingle)
IfTypeOfSourceIsTextBoxThen
txtTarget.Text=Source.Text
Source.Text=""
Else
txtTarget.Text=Source.Caption
Source.Caption=""
EndIf
EndSub
程序运行后,当用鼠标左键按住lblSource,即可将lblSource中的内容移动到txtTarget中;当按住Ctrl键并用鼠标左键按住txtSource,即可将txtSource中的内容移动到txtTarget中。
12.2.1KeyPress事件
在VisualBasic中,提供KeyPress、KeyDown、KeyUp三种键盘事件,窗体和接受键盘输入的控件都识别这三种事件。
◆KeyPress:
按下对应某ASCII字符的键。
◆KeyDown:
按下键盘的任意键。
◆KeyUp:
释放键盘的任意键只有获得焦点的对象才能够接受键盘事件。
在按下与ASCII字符对应的键时将触发KeyPress事件。
KeyPress事件过程的语法格式是:
SubObject_KeyPress(KeyAsciiAsInteger)
其中:
Object是指窗体或控件对象名,KeyAscii参数返回对应于ASCII字符代码的整型数值。
【例】如果希望将文本框中的所有字符都强制转换为大写字符,则可在输入时使用此事件转换大小写:
PrivateSubText1_KeyPress(KeyAsciiAsInteger)
KeyAscii=Asc(Ucase(Chr(KeyAscii)))
EndSub
【例】通过编程序,在一个文本框(Text1)中限定只能输入数字、小数点,只能响应BackSpace键及回车键。
PrivateSubText1_KeyPress(KeyAsciiAsInteger)
SelectCaseKeyAscii
Case48to57,46,8,13
CaseElse
KeyAscii=0
EndSelect
EndSub
通过此代码使KeyPress事件只识别Enter、Tab和Backspace键。
不能能够检测其它功能键、编辑键和定位键。
12.2.2KeyDown和KeyUP事件
当一个对象具有焦点时按下(KeyDown)或松开(KeyUp)一个键时发生。
它们报告键盘本身准确的物理状态:
按下键(KeyDown)及松开键(KeyUp)。
KeyDown和KeyUp事件能够检测其它功能键、编辑键和定位键。
KeyUp和KeyDown事件过程的语法格式如下:
SubObject_KeyDown(KeyCodeAsInteger,ShiftAsInteger)
SubObject_KeyUp(KeyCodeAsInteger,ShiftAsInteger)
说明:
◆Keycode参数
Keycode参数表示按下的物理键。
上档键字符和下档键字符也是使用同一键,它们的Keycode值相同。
下表12-2对Keycode值和KeyAscii值进行了比较。
表12-2
键(字符)
Keycode值
KeyAscii值
“A”
&H41
&H41
“a”
&H41
&H61
“!
”
&H31
&H21
“1”(大键盘上)
&H31
&H31
“1”(数字键盘上)
&H61
&H31
HOME键
&H24
&H24
F10键
&H79
无
Keycode参数通过ASCII值或键代码常数来识别键。
字母键的键代码与此字母的大写字符的ASCII值相同。
所以"A"和"a"的Keycode都是由Asc("A")返回的数值。
在下例中用KeyDown事件判断是否按下了"A"键:
PrivateSubText1_KeyDown(KeyCodeAsInteger,ShiftAsInteger)
IfKeyCode=vbKeyAThen
MsgBox"YoupressedtheAkey.“
Endif
EndSub
◆shift参数
shift表示是在该事件发生时响应SHIFT、CTRL和ALT键的状态,它是一个整数。
其含义与上一节中MouseMove、MouseDown、MouseUp事件中的shift参数完全相同。
【例】用Shift参数判断是否按下了字母的大写形式。
PrivateSubText1_KeyDown(KeyCodeAsInteger,ShiftAsInteger)
IfKeyCode=vbKeyAAndShift=1Then
MsgBox"YoupressedtheuppercaseAkey."
Endif
EndSub
第十二章响应鼠标和键盘事件
◆本章主要教学内容总结
通过本章的学习,使学生理解了鼠标、键盘事件的触发机制。
正确区分了KeyDow事件和KeyPress事件。