9.1 KeyPress事件
9.2 KeyDown和 KeyUP事件
9.3 鼠标事件
9.4 鼠标光标
9.5* 拖放第 9章 键盘与鼠标事件过程
9.1 KeyPress事件
Sub Form_KeyPress(KeyAscii As Integer)
Sub object_KeyPress([index As Integer,] KeyAscii As Integer)
KeyAscii用于返回一个标准 ANSI键的 ASCII码。
例 9-1 将输入到文本框 Text1的文本转换为大写,并将输入的原始字符显示在 Text2中 。
Option Explicit
Dim Str1 As String
Private Sub Text1_KeyPress(KeyAscii As Integer)
Str1 = Chr(KeyAscii) '将按键的 ASCII值转换为字符
KeyAscii = Asc(UCase(Str1)) '将字符转换为大写,并重置 Text1的字符
Text2.Text = Text2.Text & Str1 '将输入的原始字符复制到 Text2中
End Sub
KeyAscii通过引用传递,对它进行改变可给对象发送一个改变的字符 。 如将 KeyAscii改变为 0时可取消击键,这样 — 来对象便接收不到所按键的字符 。
例如,数字的 ASCII码是在 48~57范围,下列事件处理只允许用户在文本框中输入数字 ( 非数字字符被取消击键 ),
例 9_1_1 Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii < 48 Or KeyAscii > 57 Then ' 输入为非数字字符
KeyAscii = 0 ' 抑制非数字字符的输入
End If
End Sub
9.2 KeyDown和 KeyUP事件
KeyDown事件过程
Sub Form_KeyDown(KeyCode As Integer,Shift As Integer)
Sub object_KeyDown([Index As Integer,] KeyCode As Integer,
Shift As Integer)
KeyUp事件过程
Sub Form_KeyUp(KeyCode As Integer,ShiftAs Integer)
Sub object_KeyUp([Index As Integer,] KeyCode As Integer,
Shift As Integer)
参数说明
Index:是一个整数,它用来唯一标识一个在控件数组中的控件。
KeyCode:是一个键的扫描码,可以用诸如 vbKeyFl( F1键 ) 的系统常量表示,它的值只与按键在键盘上的物理位置有关,与键盘的大小写状态无关;如果按的是两个以上的组合键,KeyCode将先后得到所有这些不同物理位置键的扫描码 。
Shift:参数是一个 3位二进制的整数,标明在该事件发生时是否还同时按了 Shift,Ctrl和 Alt这三个控制键。
Shift参数的表达与含义见下面表 9-1。
例 9-2 KeyDown和 KeyUp的用法。键入 Shift键,Ctrl键和 Alt
键分别与 F2键的组合,用程序在文本框中显示所输入的键组合情况。
KeyDown和 KeyUP的用法
KeyPress KeyDown和 KeyUp
事件发生的时间 输入一个 ASCII字符 按任意一个键参数值 KeyAscii接收到字符的 ASCII值
KeyCode接收到键的扫描码按 Shift+A时事件发生的次数事件发生一次
(只由 <A>键状态决定 )
事件发生两次
<Shift>和 <A>2位置
(键盘处于大写状态 )
按 Shift+A时参数值
KeyAscii= 97 第一次 KeyCode= 17
第二次 KeyCode= 65
(键盘处于小写状态 )
按 Shift+A时参数值
KeyAscii= 65 第一次 KeyCode= 17
第二次 KeyCode= 65
KeyPress与 KeyDown,KeyUp的区别:
窗体的:
KeyPress
KeyDown
KeyUp
控件的:
KeyPress
KeyDown
KeyUp
窗体的 KeyPreview
为 True焦点在控件上输入在这里对 KeyAscii
作一点修改将影响所有控件在这里对 KeyAscii
作一点修改只影响一个控件则先发生这些窗体事件 接着又发生这些控件事件对于窗体的 KeyPreview属性:默认值是 False,如果被设置为
True,窗体将先于该窗体上的控件接收此类事件。
窗体的 KeyPreview属性例 9_1_2修改输入数据,让控件接收的全部为大写字符将 KeyPreview设置为 True,并写下列 Form_KeyPress事件代码:
Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii >= Asc("a") And KeyAscii <= Asc("z") Then
KeyAscii = KeyAscii – ( Asc("a") - Asc("A") )
End If
End Sub
Sub Form_KeyPress(KeyAscii AsInteger)
KeyAscii = KeyAscii + 1
End Sub
Sub Text1_KeyPress(KeyAscii As Integer)
KeyAscii = KeyAscii + 1
End Sub
例 9_1_3假定窗体 KeyPreview为 True,并有下面事件过程,则当在文本框中输入,1”时,实际上得到的是,3”
9.3 鼠标事件
9.3.1 MouseMove事件在窗体或控件对象上移动鼠标时发生 MouseMove事件。
在窗体和控件上发生的 MouseMove事件过程分别如下:
Private Sub Form_MouseMove([Index As Integer,]Button As
Integer,Shift As Integer,x As Single,y As Single)
…… ' 窗体上 MouseMove事件的处理代码
End Sub
Private Sub object_MouseMove([Index As Integer,]Button As
Integer,Shift As Integer,x As Single,y As Single)
…… ' 对象上 MouseMove事件的处理代码
End Sub
下面对 Button,Shift,x和 y等参数的含义进行说明 ( 见下页 ) 。
(1) Button参数:描述所按下的鼠标键是哪一个。
① 使用二进制值,B2 B1 B0
B0为 1:表示按下了鼠标左键
B1为 1:表示按下了鼠标右键
B2为 1:表示按下了鼠标中键例如,Button为 2(= 010B),即 B1 为 1,表示按下了右键;
如果按了鼠标左键,则 Button为 1(= 001B)。
②使用符号常数:
1— vbLeftButton:用户按下鼠标左键触发了事件;
2— vbRightButton:用户按下鼠标右键触发了事件;
4— vbMiddleButton:用户按下鼠标中键触发了事件 。
(2) Shift参数:描述按下鼠标键时,还按了哪一个键盘控制键。
① 二进制值形式,B2 B1 B0
B0为 1:表示还按下了 Shift键
B1为 1:表示还按下了 Ctrl键
B2为 1:表示还按下了 Alt键例如,Shift为 2(=010B),即 B1 为 1,表示 只 按下了 Shift键;
如果 同时 按了 Ctrl和 Shift键二键,则 Shift为 3(=011B)。
If Shift = 1 And Button = 2 Then
… … ' 这是 仅按住 Ctrl健 且 右击鼠标 后应执行的代码
End If
② Shift参数的符号常数形式:
1— vbShiftMask:表示 Shift键被按下
2— vbCtrlMask:表示 Ctrl键被按下
4— vbAltMask,表示 Alt键被按下
if Shfit = vbAltMask And Button = 1 Then
… … ' 这是 仅按住 Alt健 且 左击鼠标 后应执行的代码
( 3) X,Y:鼠标的当前位置坐标值。
例 9-3 MouseMove事件及其参数的演示。在窗体上移动鼠标时,文本框 Text1和 Text2中分别显示鼠标相对于窗体的实时位置坐标;在图片框 P1中移动鼠标时,
文本框 Text1和 Text2中则分别显示鼠标相对于图片框的实时位置坐标。
下图所示,是程序运行时鼠标在窗体左边界上移动的某瞬间的情景。
例 9-3 MouseMove事件及 x,y参数的演示并非对鼠标指针经过每个象素激发 MouseMove事件,而是每秒生成有限个鼠标消息,从而激发有限鼠标事件。
例 9-4用 MouseMove事件结合绘图方法,在鼠标移动时画图 。
Private Sub Form_MouseMove(Button As Integer,Shift As
Integer,X As Single,Y As Single)
Line -(X,Y) '随鼠标移动画线
Circle (X,Y),30 '每发生一次 MouseMove事件,就在线上画一个园
End Sub
例 9-4 在 MouseMove事件中画图
9.3.2 MouseDown和 MouseUp事件在窗体和控件上按下鼠标按钮时,MouseDown事件发生 。
Private Sub Form_ MouseDown ([Index As Integer,]Button
As Integer,Shift As Integer,x As Single,y As Single)
…… ' 窗体上 MouseDown事件的处理代码
End Sub
Private Sub object_ MouseDown ([Index As Integer,]Button
As Integer,Shift As Integer,x As Single,y As Single)
…… ' 对象上 MouseDown事件的处理代码
End Sub
对于 Button,Shift,x,y参数的设置及含义,与 MouseMove
事件相同。

9.3.2 MouseDown和 MouseUp事件在窗体和控件上释放鼠标按钮时,MouseUp事件发生 。
Private Sub Form_ MouseUp ([Index As Integer,]Button As
Integer,Shift As Integer,x As Single,y As Single)
…… ' 窗体上 MouseUp事件的处理代码
End Sub
Private Sub object_ MouseUp ([Index As Integer,]Button As
Integer,Shift As Integer,x As Single,y As Single)
…… ' 对象上 MouseUp事件的处理代码
End Sub
对于 Button,Shift,x,y参数的设置及含义,与 MouseMove
事件相同 。
例 9-5 结合 MouseUp,MouseDown和 MouseMove事件,
设计一个直接用鼠标画图的简单画图程序 。 实现如下功能:
鼠标任意按键被按下时启动绘图状态,这时,当用户按鼠标左键并移动时可以画出宽度为 2的细点 (DrawWidth=2);
而 按 鼠 标 右 键 移 动 时 可 以 画 出 宽 度 为 6 的 粗 点
(DrawWidth=6)。 而当鼠标按键弹起时,禁止绘图功能 。
例 9-5 结合三种鼠标事件画图
9.4 鼠标光标
9.4.1 利用 MousePointer属性改变鼠标指针样式
MousePointer属性可以用来定义显示各种鼠标指针 。
标指针的定义格式如下:
对象名称,MousePointer=设定值设定值为 0~ 15时分别对应 16种预定义的指针 。
9.4.2 利用 MouseIcon属性自定义鼠标指针当 MousePointer 属 性 值 被 设 定 成 99 时,还 可 以 利 用
MouseIcon属性自定义鼠标指针 。 MouseIcon属性提供一个自定义图标,即该属性可以设置成一个图标文件 。
MouseIcon属性值的设定既可利用属性表在设计时指定;也可在运行时通过语句指定 。 用语句指定的语法如下:
对象名,MouseIcon= LoadPicture( PathName)
对象名,MouseIcon=另一对象名,Picture
例 9-6 窗体上有一标签 Label1和一个计时器 。 设置标签的鼠标指针,使鼠标指针指向标签时成为手形指针 。 当单击标签时窗体中的鼠标指针成为系统忙指针,然后每隔 1秒激发一次计时器事件;当调用 3次计时器事件过程后停止计时器事件,同时窗体的鼠标指针恢复为默认指针 。 用语句实现上述指针变换功能 。
9.5* 拖放引例,使用 DragDrop将窗体上任意控件拖放将各控件的 DragMode属性设为 1;编写窗体的 DragDrop事件
9.5.1 Drag方法用于除了 Line,Menu,Shape,Timer或 CommonDialog
控件之外的任何控件的开始,结束或取消拖动操作 。
Drag方法的语法格式如下:
[控件名称,]Drag 参数其中,参数的含义为:
参数= 0:开始拖放操作参数= 1:结束拖放操作。参数= 1时可省略不写。
参数= 2:取消拖放操作通常,只有当对象的 DragMode属性设置为手工 (0)时,才需要使用 Drag方法控制拖放操作。但是,也可以对 DragMode属性设置为自动( 1或 vbAutomatic)的对象使用 Drag。
1,DragMode属性
0,(缺省 ),手工拖动模式
1,自动拖动模式
2,DragIcon属性
DragIcon属性表示拖动过程中显示的图标 (Ico或 Cur文件 )。
如果在拖动对象过程中想改变鼠标指针形状,可使用 DragIcon
或 MousePointer属性 。 如果没有指定 DragIcon属性,则只能使用
MousePointer属性 。
例如:
Label1.DragIcon=LoadPicture ("C:\Icons\Mail.ico")
Label2.DragIcon=picIcon.Picture
9.5.2 DragOver事件和 DragDrop事件
1,DragOver事件
DragOver事件在拖放操作正在进行时发生 。 可使用此事件对鼠标指针在一个有效目标上的进入,离开或停顿等进行监控 。 鼠标指针的位置决定接收此事件的目标对象 。
DragOver事件的语法格式如下:
Private Sub Form_DragOver(source As Control,x As Single,
y As Single,state As Integer)
Private Sub MDIForm_DragOver(source As Control,x As
Single,y As Single,state As Integer)
Private Sub object_DragOver([index As Integer,]source As
Control,x As Single,y As Single,state As Integer)
例 9-7 本例演示一种指示有效的拖放目标的方法。当一个 TextBox
控件被拖过一个 PictureBox控件时,指针从缺省的箭头变为特定的图标。当源被拖到其它地方时,指针恢复到缺省的状态。将
TextBox控件的 DragMode属性设置为 1,然后启动程序,并把
TextBox拖过 PictureBox。
2,DragDrop事件在一个完整的拖放动作 ( 即将一个控件拖动到一个对象上,并释放鼠标按钮 ) 完成,或使用 Drag方法,并将其 action参数被设置为
2 (Drop)时,DragDrop事件发生 。
DragDrop事件的语法格式如下:
Private Sub Form_DragDrop(source As Control,x As Single,y As Single)
Private Sub MDIForm_DragDrop(source As Control,x As Single,y As Single)
Private Sub object_DragDrop([index As Integer,]source As Control,x As Single,y
As Single)
其中,source,x,y和 index参数的定义和 DragOver事件的相同。
当 source参数中可能使用多个控件时,应使用 TypeOf关键字和 If语句一起确定与 source表示的控件的类型;格式如下:
If TypeOf 对象变量名 Is 控件类型名 Then
其中 TypeOf函数返回值为对象变量所引用的控件的类型 。
例 9-8 演示将一个 PictureBox控件拖放到另一个 PictureBox
控件上的视觉效果。窗体上含有 3个 PictureBox控件;将
Picture1和 Picture2的 DragMode属性设置为 1(自动);
使用 Picture属性将位图赋值给 Picture1和 Picture2。然后在程序运行中实现将 Picture1或 Picture2拖到 Picture3上。
例 9-8 拖放发生时的界面