
第四章VB高级语言技巧 一、要点解析 本章以一个多功能计算器应用程序为实例,较系统介绍了数组、过程、函数的定义和使 用方法,详细讲解了鼠标和键盘的常用使用技巧。通过本章学习,你应该能够达到如下学习 目标, 1.掌根数组的使用方法 2,掌握键盘、鼠标的使用技巧 3,素握过程和函数的定义和调用方法 4,章握AP叫函数的调用方法 5.了解枚举及自定义数据类型 6.理解“多功能计算器”程序设计过程 从“多功能计算器”应用程序开发入手,学习本章内容。 主要知识点分析 1,静志数组 静态数组是在声明时已经确定了大小的数组,即数组元素的个数固定不变。声明静志数 组的方法有两种。 方法1 Dm数组名(上界)As数据类型 如DimM3)As Integer 该语句定义了一个一推数组,数组名字为A。类型为整显。包括4个数组元素。分别是 A(0).A(1).A(2).A(3). DimM3,3)s Integ▣,该语句定文了I6个数组元素. (2)方法2 Dm数组名(下界T上界) 年Dim A(1To3)As Integ 该语句定义了一个包含3个元素的数组,分别是M1,M2),M3): Dim A(1To5,1To5匀As Integer,该语句定义了25个数组元素。 应注意以下儿点: (1)在数组声明中的下标用于确定每一维的大小,是数组的说明符:数组元素的下标 是用于确定某一指定的元素。例如: Dim A(3)As Ineger ·下标3用于确定A数组有4个元素 A(3) 4下标3用来指定数组元素M3) (2)在声明数组时,下标必须为常量。而在引用数组元素时,下标可以是常量,变量 或表达式。例如: Dim A(n)As Ineger A(n10 ·为下标值为n的元素赋值 1
1 第四章 VB 高级语言技巧 一、要点解析 本章以一个多功能计算器应用程序为实例,较系统介绍了数组、过程、函数的定义和使 用方法,详细讲解了鼠标和键盘的常用使用技巧。通过本章学习,你应该能够达到如下学习 目标: 1.掌握数组的使用方法 2.掌握键盘、鼠标的使用技巧 3.掌握过程和函数的定义和调用方法 4.掌握 API 函数的调用方法 5.了解枚举及自定义数据类型 6.理解“多功能计算器”程序设计过程 从“多功能计算器”应用程序开发入手,学习本章内容。 主要知识点分析 1.静态数组 静态数组是在声明时已经确定了大小的数组,即数组元素的个数固定不变。声明静态数 组的方法有两种。 方法 1 Dim 数组名(上界) As 数据类型 如 Dim A(3) As Integer 该语句定义了一个一维数组,数组名字为 A,类型为整型,包括 4 个数组元素,分别是 A(0),A(1),A(2),A(3)。 Dim A(3,3) As Integer,该语句定义了 16 个数组元素。 (2)方法 2 Dim 数组名(下界 To 上界) 如 Dim A(1 To 3) As Integer 该语句定义了一个包含 3 个元素的数组,分别是 A(1),A(2),A(3)。 Dim A(1 To 5,1 To 5) As Integer,该语句定义了 25 个数组元素。 应注意以下几点: (1)在数组声明中的下标用于确定每一维的大小,是数组的说明符;数组元素的下标 是用于确定某一指定的元素。例如: Dim A(3) As Integer ‘下标 3 用于确定 A 数组有 4 个元素 A(3) ‘下标 3 用来指定数组元素 A(3) (2)在声明数组时,下标必须为常量,而在引用数组元素时,下标可以是常量、变量 或表达式。例如: Dim A(n) As Integer A(n)=10 ‘为下标值为 n 的元素赋值

A3+4=10 ·用表达式的值米指定数组元素的下标 (3)若想政变下标下界的默认值0,可在Visunl Bas©的窗体模块或标准模块中用Oi©m Bcn语句重新设定数组的下界。例如: Option Base 1 ·设定数组下标下界为】 2.过程和函数的定义 将一个大程序分割成多个具有鞋立功能的亚辑段以实现系统功能,这些逻辑段就称为 过程。在程序设计中,经常会有重复的部分,如果把重复的部分作成一个函数或一个过程, 在使用时进行调用,可以节省大量的输入代玛的时间。VB中有两种过程,即Sb过程(子 过程)或Function过程(函数过程)。 (1)sab过程 在VB中将Sb..EdSb定义的子程序称为Sb过程,成称子过程。Sub过程又分为 事件过程和通用过程。 事件过程我们已经不陌生了,如下面的一段程序是一个事件过程: Privale Sub Commandl Click(Index As Integer) If txtLabel.Text ="Then txtFirst.Text"txtFirst.Text+Trim(Str(Index)) Else txtSecond.Text -txtSecond Text+TrimStr(Index)) End If End Sub 事件过程的定义格式为: Private Sub_) 过程体 End Sub 上述事件过程用Sb语句标识过程的开始,用EdSb语句标识过程的结束,由过程体 完成该过程的运算和操作功能:为事件过程的过程名格式。其中控件名 为控件的Name属性值,事件名为该控件要触发的事件名称,挖件名可以通过Name属性修 改,而事件名是弱统预先为每个对象定义好的,不能修政。例如,命令按纽Command1的 单击事件过程名为Commandl_Click,如果将命令核组重新命名为cmdCN,则命令按组的单 击事件过程名为©ndCN_Click。事件过程保存在窗体模块文件中。事件过程是一个私有过 程。 ·通用过程通用过程与事件过程不同,通用过程并不需要与用户界面中的任何对象相 联系,它不是由鼠标触发的,而您须由其它过程调用,通用过程候存在窗体核块和标准 惊块中。婚用过程的语法格式为: [PrivatelPublic][Static]Sub(过程名>([(形参表)]) 过程体 End Sub 使用时应注意以下几点: :通用过程的过程名由用户定义,自必须符合B标识符命名规则,同一个模块中不 允许两个过程名同名, 通用过程可以定义为Private,Public、Static,缺省时为Public. 同事件过程一样,通用过程可以是有参过程,也可以是无参过程。 2
2 A(3+4)=10 ‘用表达式的值来指定数组元素的下标 (3)若想改变下标下界的默认值 0,可在 Visual Basic 的窗体模块或标准模块中用 Option Base n 语句重新设定数组的下界。例如: Option Base 1 ‘设定数组下标下界为 1 2.过程和函数的定义 将一个大程序分割成多个具有独立功能的逻辑段以实现系统功能,这些逻辑段就称为 过程。在程序设计中,经常会有重复的部分,如果把重复的部分作成一个函数或一个过程, 在使用时进行调用,可以节省大量的输入代码的时间。VB 中有两种过程,即 Sub 过程(子 过程)或 Function 过程(函数过程)。 (1)Sub 过程 在 VB 中将 Sub…End Sub 定义的子程序称为 Sub 过程,或称子过程。Sub 过程又分为 事件过程和通用过程。 ⚫ 事件过程我们已经不陌生了,如下面的一段程序就是一个事件过程: Private Sub Command1_Click(Index As Integer) If txtLabel.Text = "" Then txtFirst.Text = txtFirst.Text + Trim(Str(Index)) Else txtSecond.Text = txtSecond.Text + Trim(Str(Index)) End If End Sub 事件过程的定义格式为: Private Sub _() 过程体 End Sub 上述事件过程用 Sub 语句标识过程的开始,用 End Sub 语句标识过程的结束,由过程体 完成该过程的运算和操作功能;_为事件过程的过程名格式。其中控件名 为控件的 Name 属性值,事件名为该控件要触发的事件名称,控件名可以通过 Name 属性修 改,而事件名是系统预先为每个对象定义好的,不能修改。例如,命令按纽 Command1 的 单击事件过程名为 Command1_Click,如果将命令按纽重新命名为 cmdCN,则命令按纽的单 击事件过程名为 cmdCN_ Click。事件过程保存在窗体模块文件中。事件过程是一个私有过 程。 ⚫ 通用过程 通用过程与事件过程不同,通用过程并不需要与用户界面中的任何对象相 联系,它不是由鼠标触发的,而必须由其它过程调用。通用过程保存在窗体模块和标准 模块中。通用过程的语法格式为: [Private|Public][Static]Sub([]) 过程体 End Sub 使用时应注意以下几点: ➢ 通用过程的过程名由用户定义,但必须符合 VB 标识符命名规则,同一个模块中不 允许两个过程名同名。 ➢ 通用过程可以定义为 Private、Public、Static,缺省时为 Public。 ➢ 同事件过程一样,通用过程可以是有参过程,也可以是无参过程

:在Sub过程内部,不能再定义一个Sub过程或Function过程. ,Sub过程没有返国值 例1编写全同Sub过程计算d Puhlic Suh Fact域n As Integer,F As Double)Fact为过程名,参数F用于运回阶乘值 DimiAs Integer F=1 Fori=I Ton F=F◆i Nexti End Sub (2)Functi0n过程 两数过程的语法格式为: [rivatelPublic][Static]Function])[As(类型] 过程体 End Function 使用说明 (I》函数过程以Function语句开始,以End Function结束,两者之间的语句移为函数 体,由函数体完成该函数的数据处理功橙并取得函数的返回值, (2)函数过程名的命名要求、形参的含文以及Public、Private,Static等关键字的含 义与通用过程相同。 (3)函数过程通过函数过程名返日值,因此函数过程名是有类型的,其类型在Fun心t1on 语句中用As(类型>加以定,可以定义为Integer、Long、Single、Double、Boolean或 String,若缺省了As语句,则函数过程名的类型为Variant, (4)在两数过程结束前,函数过程名必须被赋予一个值作为函数的返回值,通过赋植 语句(函数过程名)。《表达式)来实现,如果在函数体中没有该赋植语句,函数过程将运国 一个默认值:数植函数过程返回。字符事函数过程返回一个空串, (5)可在函数体内用Exit Functio随提前是出Function过程。 (6)Function过程不能定文在Sub过程中,也不能在Function过程中再定文一个 Function过程或Sub过程, 上述S动过程和nction过程都可以通过从“工具”菜单中选择“添加过程”来建立, 例2编写全局Function过程计算d Public Function Fact(nAs Integer)As Long“参数n为整型,函数值为长整型 DimiAs Integer F=1 “F用于保存阶乘值 Fori=l Ton F=Fi Next I Fact"F “给函数过程名赋值 End Function 3。过程和函数的调用 过程定义完成后,其它程序就可以调用该过程,调用过程的程序段称为调用程序。 (1)通用过程的调用 使用Ca11语句博用过程,有两种方法:
3 ➢ 在 Sub 过程内部,不能再定义一个 Sub 过程或 Function 过程。 ➢ Sub 过程没有返回值 例 1 编写全局 Sub 过程计算 n! Public Sub Fact(n As Integer, F As Double) ‘Fact 为过程名,参数 F 用于返回阶乘值 Dim i As Integer F = 1 For i = 1 To n F = F * i Next i End Sub (2)Function 过程 函数过程的语法格式为: [Private|Public][Static]Function([])[As] 过程体 End Function 使用说明 (1) 函数过程以 Function 语句开始,以 End Function 结束,两者之间的语句称为函数 体,由函数体完成该函数的数据处理功能并取得函数的返回值。 (2)函数过程名的命名要求、形参的含义以及 Public、Private、Static 等关键字的含 义与通用过程相同。 (3)函数过程通过函数过程名返回值,因此函数过程名是有类型的,其类型在 Function 语句中用 As加以定义,可以定义为 Integer、Long、Single、Double、 Boolean 或 String。若缺省了 As 语句,则函数过程名的类型为 Variant。 (4)在函数过程结束前,函数过程名必须被赋予一个值作为函数的返回值,通过赋值 语句=〈表达式〉来实现,如果在函数体中没有该赋值语句,函数过程将返回 一个默认值:数值函数过程返回 0,字符串函数过程返回一个空串。 (5)可在函数体内用 Exit Function 提前退出 Function 过程。 (6)Function 过程不能定义在 Sub 过程中,也不能在 Function 过程中再定义一个 Function 过程或 Sub 过程。 上述 Sub 过程和 Function 过程都可以通过从“工具”菜单中选择“添加过程”来建立。 例 2 编写全局 Function 过程计算 n! Public Function Fact(n As Integer) As Long ‘参数 n 为整型,函数值为长整型 Dim i As Integer F = 1 ‘F 用于保存阶乘值 For i = 1 To n F = F * i Next I Fact = F ‘给函数过程名赋值 End Function 3.过程和函数的调用 过程定义完成后,其它程序就可以调用该过程,调用过程的程序段称为调用程序。 (1)通用过程的调用 使用 Call 语句调用过程,有两种方法:

调用格式一:Ca11(《实参表>) 调用格式二:《过程名)(实参表) 说明如下: :《过程名)代表要调用的5b过程名 《实参表》代表要传送给Sb过程的常量、变量成表达式,各参数之间用逗号 分隔。如果是数组参数。则要在数组名之后鼎一对空括号。 当使用C语句时,参数必须在括号内。 Call MyProc (FirstArgument,SecondArgument) 若省略C山美健字,则也必须省略参数两边的括号: 如:yProc FirstArgument,SecondArgument 例3在键盘上任意输入一个整数,然后调用例1的F过程计算该数的阶乘。 ①界面设计:在窗体上添加一个文本框Textl,川于输入一个整数,添加1h1和e2 用于输出该整数的阶乘值,添加一个俞令按纽CommandI,在CommandI的ick的事件过 程中调用Fa过程. ②编写代码如下: Public Sub Fact(n As Integer,.F As Long)F为过程名,参数F用于返回阶乘值 Dim i As Integer F=1 Fori=I Ton F=Fi Nedt i End Sub Private Sub Command1_Click() Dim x As Integer,FfAs Long x Val(Textl.Text) Call Fact(x,Ff) '或Fatx,Ff La止el2.Caption-TrimStr(x))&"的阶乘为:· Label3.Caption =TrimStr(Fact(x))) End Sub 程序运行界面如下, .Ferml 回☒ ✉7on ▣回X 输入任意一个型 输入任意一个整数 的阶乘为: 3的阶乘为: 计其阶聚 计前防秦 设计界面 运行界面
4 调用格式一:Call() 调用格式二: 说明如下: ➢ 代表要调用的 Sub 过程名 ➢ 代表要传送给 Sub 过程的常量、变量或表达式,各参数之间用逗号 分隔。如果是数组参数,则要在数组名之后跟一对空括号。 ➢ 当使用 Call 语句时,参数必须在括号内。 如:Call MyProc (FirstArgument, SecondArgument) 若省略 Call 关键字,则也必须省略参数两边的括号。 如:MyProc FirstArgument, SecondArgument 例 3 在键盘上任意输入一个整数,然后调用例 1 的 Fact 过程计算该数的阶乘。 ①界面设计:在窗体上添加一个文本框 Text1,用于输入一个整数,添加 Label1 和 Labei2 用于输出该整数的阶乘值,添加一个命令按纽 Command1,在 Command1 的 Click 的事件过 程中调用 Fact 过程。 ②编写代码如下: Public Sub Fact(n As Integer, F As Long) ‘Fact 为过程名,参数 F 用于返回阶乘值 Dim i As Integer F = 1 For i = 1 To n F = F * i Next i End Sub Private Sub Command1_Click() Dim x As Integer, Ff As Long x = Val(Text1.Text) Call Fact(x, Ff) '或 Factx, Ff Label2.Caption = Trim(Str(x)) & "的阶乘为:" Label3.Caption = Trim(Str(Fact(x))) End Sub 程序运行界面如下: 设计界面 运行界面

(2)函数过程(Futn过程)的调用 崖义函数过程的目的是为了在其它过程中词用,通过调用将一些参数值传通给函数过 程中,在函数过程中利用参数值计算并返回函数值。在调用程序中要把被调用的函数作为表 达式的一邻分。调川形式为 (川《实际参数列表)]) 例4在键盘上任意输入一个整数,然后调用例2的Fun过程计算该数的阶乘。 程序代码如下: Public Function Fact(nAs Integer)As Long“参数n为参型,函数值为长整型 Dim i As Integer F=1 “下用于保存阶乘值 Fori=ITon F=F◆i Next I Fact-F “给函数过程名赋值 End Function ‘在Comnandl按细的C1ick事件过程中调用函数过程 Private Sub Commandl_Click() Dim x As Integer x■Val (Textl.Text) abel2.Caption=Trim(Str(x)》&“的阶乘为:“ Label3.Caption Trim(Str(Fact (x))) “使用Fax)调用函数过程 End Sub 4.参数传递 (1)形参和实参 形参,出现在Sub过程的Sub语句中,或出现在Function过程的Function语句中。 实参,出现在S南过程厦Fon过程的调用语句中。例如: Public Sub Factin As Integer,F As Double) 形参 End Sub 调用语句 Call Factl,Ef) 实参 在未出现过程博用时,形参并不占存储单元,只有在发生过程用时,形参才被分配存 储单元。在调用结衷后,形参所占的存储单元被释故。 音发生过程调用时,实参与形参按位置的对应关系相结合。例如上而的例子: 过程定义 Public Sub FactinAs Integer,F As Double) 调用语句 Call Fact (x.Ff)
5 (2)函数过程(Functin 过程)的调用 定义函数过程的目的是为了在其它过程中调用,通过调用将一些参数值传递给函数过 程中,在函数过程中利用参数值计算并返回函数值。在调用程序中要把被调用的函数作为表 达式的一部分,调用形式为 ([〈实际参数列表〉]) 例 4 在键盘上任意输入一个整数,然后调用例 2 的 Function 过程计算该数的阶乘。 程序代码如下: Public Function Fact(n As Integer) As Long ‘参数 n 为整型,函数值为长整型 Dim i As Integer F = 1 ‘F 用于保存阶乘值 For i = 1 To n F = F * i Next I Fact = F ‘给函数过程名赋值 End Function ‘在 Command1 按纽的 Click 事件过程中调用函数过程 Private Sub Command1_Click() Dim x As Integer x = Val(Text1.Text) Label2.Caption = Trim(Str(x)) & "的阶乘为:" Label3.Caption = Trim(Str(Fact(x))) ‘使用 Fact(x)调用函数过程 End Sub 4.参数传递 (1)形参和实参 形参:出现在 Sub 过程的 Sub 语句中,或出现在 Function 过程的 Function 语句中。 实参:出现在 Sub 过程或 Function 过程的调用语句中。例如: Public Sub Fact(n As Integer, F As Double) … End Sub 调用语句 Call Fact(x, Ff) 在未出现过程调用时,形参并不占存储单元,只有在发生过程调用时,形参才被分配存 储单元。在调用结束后,形参所占的存储单元被释放。 当发生过程调用时,实参与形参按位置的对应关系相结合。例如上面的例子: 形参 实参 过程定义 Public Sub Fact(n As Integer, F As Double) 调用语句 Call Fact (x, Ff)

通过实参与形参的结合完成博用过程和棱调过程的数据传递,通常有拔植传递和按地址 传递两种方式。 (2)按值传通 按值传递是指实参把值传递给形参而不传递实参的地址。当爱生过程调用时,系统肥需 要传逸的实参复制到一个监时的存他单元中,然后把临时单元与形参结合。因此,在这个过 程中,形参值的改变不会影响到实参植,数据的传送是单向的。 以下两件情况均是按值传递的 一实参是常量成表达式: 例如 过程定文 Public Sub FactinAs Integer,F As Double) 过程调用 Call Fact(2升5) 实参是变量,委实现按值传递,需要在形参之前用By关键字如以说明 过程定义: Public Sub Fact(By Val n As Integer,ByVal F As Double) 过程调用 Call Fact (x,Ff) 例5,下面的程序采用按值传递 Private Sub wwByVal x.ByVal y As.ByVal z x-x+2 y-y+2 2=2+2 End Sub Private Sub Commandl Clicki) A=1:B=2:C=3 Call wwA.B.C) Print A,B.C End Sub 运行时,单击命令按组,在窗体上打印如下结果: 2 3 在金令按纽Command1的Cick事件过程中执行Caw(A.B,C)语句时,A,B、C以 按值传通的方式分别与形参变量X,Y、Z结合,在ww过程中改变了变量X,Y,Z的 值,但从w过程返回时,这些值不会影响调用过程A,B,C的值,因此打印A,B,C 的值与执行Cl语句之前相间。 (3)按地址传域 按地址传递即指将实参的地址传给对应的形参,使形参和实参具有相同的地址,意味着 形参与实参共享同一个存储单元,形参的值也纸是实参的值,因此主调过程对核调过程的数 据传遥是双向的: 按地址传墙的前提是: (1)调用过程时实参是变量名,数组名(后面跟一对圆括号) 6
6 通过实参与形参的结合完成调用过程和被调过程的数据传递,通常有按值传递和按地址 传递两种方式。 (2)按值传递 按值传递是指实参把值传递给形参而不传递实参的地址。当发生过程调用时,系统把需 要传递的实参复制到一个临时的存储单元中,然后把临时单元与形参结合。因此,在这个过 程中,形参值的改变不会影响到实参值,数据的传送是单向的。 以下两种情况均是按值传递的 ➢ 实参是常量或表达式; 例如 ➢ 实参是变量,要实现按值传递,需要在形参之前用 ByVal 关键字加以说明。 过程定义: Public Sub Fact(ByVal n As Integer, ByVal F As Double) 过程调用 Call Fact (x, Ff) 例 5,下面的程序采用按值传递 Private Sub ww(ByVal x , ByVal y As , ByVal z ) x = x + 2 y = y + 2 z = z + 2 End Sub Private Sub Command1_Click() A = 1: B = 2: C = 3 Call ww(A, B, C) Print A, B, C End Sub 运行时,单击命令按纽,在窗体上打印如下结果: 1 2 3 在命令按纽 Command1 的 Click 事件过程中执行 Call ww(A,B,C)语句时,A、B、C 以 按值传递的方式分别与形参变量 X、Y、Z 结合,在 ww 过程中改变了变量 X、Y、Z 的 值,但从 ww 过程返回时,这些值不会影响调用过程 A、B、C 的值,因此打印 A、B、C 的值与执行 Call 语句之前相同。 (3)按地址传递 按地址传递即指将实参的地址传给对应的形参,使形参和实参具有相同的地址,意味着 形参与实参共享同一个存储单元,形参的值也就是实参的值。因此主调过程对被调过程的数 据传递是双向的。 按地址传递的前提是: (1)调用过程时实参是变量名、数组名(后面跟一对圆括号) 过程定义 Public Sub Fact(n As Integer, F As Double) 过程调用 Call Fact (2, 3+5)

(2)定义过程时形参用B队Rf关键字加以说明,成省略ByRf,也不加By。 上而例5若在w过程中将改为By,群表示按地址传遥 运行结果为:345 创6.编写一个Sub过程,计算N个数的和,即1+2++N,并通过命令核组的单击事 件调用该过程计算S-1+(1*2)◆(1+23)中(1+23*K). 分析:用5动过程计算1+2++城,首先需要设置参数N,另外需要引入一个参数5,用 于返目该和值。程序如下: Public Sub Al(N As Integer,5 As Lomg) S=0 ForJ■1ToN s=5+J Next J End Sub Private Sub Commandl_() Dim K As Integer.S1 As Integer,I As Integer K Val (Textl.Text) For I 1 To K Call Al(I,S1) ·调用过程A1求1+2++1,和值运日到S1中 SumSum S1 Next I Text2.Text Sun End Sub 5.健盘事件 VB提供了3种健盘事件,即: ● KeyDown事件,按下健盘上的任意键 ·KgUp事件:释放健世的任意键 KeyPress事件:按下对应某ASCII字符的键 (1)KeyDown事件和KeyUp事件 被下键盘上的任意一个键,就会引发当前具有焦点的对象的K。Dw事件。释放时, 则会引发该对象的KeyUp事件. 以窗体为例,KeyDown事件和KeUp事件的语法如下: Private Sub Form_KeyDown(KeyCode As Integer,Shift As Integer) 语句组 End Sub
7 (2)定义过程时形参用 ByRef 关键字加以说明,或省略 ByRef,也不加 ByVal。 上面例 5 若在 ww 过程中将 ByVal 改为 ByVel,则表示按地址传递 运行结果为:3 4 5 例 6.编写一个 Sub 过程,计算 N 个数的和,即 1+2+…+N,并通过命令按纽的单击事 件调用该过程计算 S=1+(1+2)+(1+2+3)+…+(1+2+3+…+K)。 分析:用 Sub 过程计算 1+2+…+N,首先需要设置参数 N,另外需要引入一个参数 S,用 于返回该和值。程序如下: Public Sub A1(N As Integer, S As Long) S = 0 For J = 1 To N S = S + J Next J End Sub Private Sub Command1_() Dim K As Integer, S1 As Integer, I As Integer K = Val(Text1.Text) For I = 1 To K Call A1(I, S1) ' 调用过程 A1 求 1+2+…+I,和值返回到 S1 中 Sum = Sum + S1 Next I Text2.Text = Sum End Sub 5.键盘事件 VB 提供了 3 种键盘事件,即: ⚫ KeyDown 事件:按下键盘上的任意键 ⚫ KeyUp 事件:释放键盘的任意键 ⚫ KeyPress 事件:按下对应某 ASCII 字符的键 (1)KeyDown 事件和 KeyUp 事件 按下键盘上的任意一个键,就会引发当前具有焦点的对象的 KeyDown 事件。释放时, 则会引发该对象的 KeyUp 事件。 以窗体为例,KeyDown 事件和 KeyUp 事件的语法如下: Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 语句组 End Sub

和 Private Sub Form_KeyUp(KeyCode As Integer.Shift As Integer) 语句组 End Sub ①Keok参数 KeyCode参数是一个整数,返日所按键的键码值,键码值是以“键”为准。例如,由 于大写字母和小写字母使用具一键,因此“A”和“:”的健码值是相同的。又如大键 盘上的数字“1”和小建盘上的数字“1”,虽然是同一数字,但由于键不同,它们的键 码值也不相同。常用键的键码值如表41所示 表+1常用键健的健码值 按健 健码值 按健 健码值 F1-F10 112-121 Backspace 8 Tab 9 Enter 13 E 27 PageUp 33 PageDown 34 Home 35 End 36 Ins 45 D 46 47 48 49 ↓ 40 ②Shif参数 Sin参数是一个整数值,返回S近,Cl、A的状态。贝有检查此状态才能判断输 入的是大写还是小写字得, Shn参数用来判断是否按下了健盘上的Shin、Cl和AL,或这3个键的任意组合, 其对应的关系如表42所示: 表42Shin的取值和ShiB、Crl和At组合状态的对应关系 符号常数 Shin的取值 Shin,Cl和Alt组合状态 0 三个健都没有 VbShinMask 按下shin键 VbCtrlMask 2 按下C键 VhShiftMask+VbCtrlMask 同时按下Shin健和Cl键 VhAlLMask 4 按下AIt健 VhShiftMask+VbAltMask 同时按下shin键和At健 VbCtrlMask VbAltMask 同时按下C键和A:键 VhShifMask+VbCtrlMask+VbAltMask 7 同时按下三个键 下面的代到将测试你当前按下的健。并通过消息据告诉你。 Private Sub Textl_KeyDowrKeyCode As Integer.Shift As Integer) Dim ShiftKey As Integer ShiftKey "Shift And 7 7对应为1+2+4 Select Case ShiftKey CeI"或VbShiftMask MsgBox "You pressed the Shift key
8 和 Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) 语句组 End Sub ①Keycode 参数 KeyCode 参数是一个整数,返回所按键的键码值。键码值是以“键”为准。例如,由 于大写字母和小写字母使用同一键,因此“A”和“a”的键码值是相同的。又如大键 盘上的数字“1”和小建盘上的数字“1”,虽然是同一数字,但由于键不同,它们的键 码值也不相同。常用键的键码值如表 4-1 所示: 表 4-1 常用键的键码值 按键 键码值 按键 键码值 F1-F10 112-121 Backspace 8 Tab 9 Enter 13 Esc 27 PageUp 33 PageDown 34 Home 35 End 36 Ins 45 Del 46 ← 47 ↑ 48 → 49 ↓ 40 ②Shift 参数 Shift 参数是一个整数值,返回 Shift、Ctrl、Alt 的状态。只有检查此状态才能判断输 入的是大写还是小写字母。 Shift 参数用来判断是否按下了键盘上的 Shift、Ctrl 和 Alt,或这 3 个键的任意组合, 其对应的关系如表 4-2 所示: 表 4-2 Shift 的取值和 Shift、Ctrl 和 Alt 组合状态的对应关系 符号常数 Shift 的取值 Shift、Ctrl 和 Alt 组合状态 - 0 三个键都没有 VbShiftMask 1 按下 Shift 键 VbCtrlMask 2 按下 Ctrl 键 VbShiftMask+ VbCtrlMask 3 同时按下 Shift 键和 Ctrl 键 VbAltMask 4 按下 Alt 键 VbShiftMask+ VbAltMask 5 同时按下 Shift 键和 Alt 键 VbCtrlMask + VbAltMask 6 同时按下 Ctrl 键和 Alt 键 VbShiftMask+ VbCtrlMask+ VbAltMask 7 同时按下三个键 下面的代码将测试你当前按下的键,并通过消息框告诉你。 Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer) Dim ShiftKey As Integer ShiftKey = Shift And 7 '7 对应为 1+2+4 Select Case ShiftKey Case 1 '或 VbShiftMask MsgBox "You pressed the Shift key

Ce2或VbCtrlMask MsgBax "You presed the Ctrl key." Cae4'或VbAltMask MsgBox "You pressed the Alt key." End Select End Sub (2)KeyPress事件 按下键世上与ASI字符对应的键时,触发KeyPres写事件,KeyPress事件能机别的 ASCI字符包括:字得键、数字键、标点符号键以及Eta键、Tb键和Backspace键。也就 是说,在键盘上除了按这些键以外,按其它键不会引发K©yPr事件, A5C码值是以按健上的字符为准。同一按量上的字符有大小之分,所以按下同一个健 时,ASC码值是不一样的。例如,“A”和“a”的ASC码值不一样。 以窗体为例,KeyPress事件的语法是: Private Sub Form_Key Press(KeyAscii As Integer) 语句组 End Sub 参数KeyAscii是一个整数,返目所按键的ASC码值。借助字符的ASCT马值来判断 用户按下的是哪一个健。 常川健的键码植和ASC码值分别如表43所示: 表43常用健的ASC码值 按健 ASCIl码值 按健 ASCI码值 Backspace 8 Tab 9 Enter 13 27 Space 32 39 40 41 42 43 44 45 .(小数点) 46 47 0-9 48-57 :(冒号) 58 分号) 59 60 61 > 62 2 63 A-Z 65-90 是 97-122 如果你塑知道键盘上各个健的AS值,可在文本框的ky多事件下编写如知下 代码。运行程序,当焦点位于该文本框上时,按下希望了解的键,消息框中就会显示 所按键的ASCI值。 Private Sub Text1_KeyPress(KeyAscii As Integer) MsgBox KeyAscii End Sub 当敲击一个有ASCI码值的键时,会月时引发KeyDown事作、Ke3Prss事件和 KgUp事件,它们发生的顺序如下: KDwn事件一KeyPress事件一KyUp事件 6.鼠标事件 9
9 Case 2 '或 VbCtrlMask MsgBox "You pressed the Ctrl key." Case 4 '或 VbAltMask MsgBox "You pressed the Alt key." End Select End Sub (2)KeyPress 事件 按下键盘上与 ASCII 字符对应的键时,触发 KeyPress 事件。KeyPress 事件能识别的 ASCII 字符包括:字母键、数字键、标点符号键以及 Enter 键、Tab 键和 Backspace 键。也就 是说,在键盘上除了按这些键以外,按其它键不会引发 KeyPress 事件。 ASCII 码值是以按键上的字符为准。同一按键上的字符有大小之分,所以按下同一个键 时,ASCII 码值是不一样的。例如,“A”和“a”的 ASCII 码值不一样。 以窗体为例,KeyPress 事件的语法是: Private Sub Form_KeyPress (KeyAscii As Integer) 语句组 End Sub 参数 KeyAscii 是一个整数,返回所按键的 ASCII 码值。借助字符的 ASCII 码值来判断 用户按下的是哪一个键。 常用键的键码值和 ASCII 码值分别如表 4-3 所示: 表 4-3 常用键的 ASCII 码值 按键 ASCII 码值 按键 ASCII 码值 Backspace 8 Tab 9 Enter 13 Esc 27 Space 32 ’ 39 ( 40 ) 41 * 42 + 43 , 44 - 45 .(小数点) 46 / 47 09 4857 :(冒号) 58 ;(分号) 59 62 ? 63 A-Z 65-90 az 97122 如果你想知道键盘上各个键的 ASCII 值,可在文本框的 keyPress 事件下编写如下 代码。运行程序,当焦点位于该文本框上时,按下希望了解的键,消息框中就会显示 所按键的 ASCII 值。 Private Sub Text1_KeyPress(KeyAscii As Integer) MsgBox KeyAscii End Sub 当敲击一个有 ASCII 码值的键时,会同时引发 KeyDown 事件、KeyPress 事件和 KeyUp 事件,它们发生的顺序如下: KeyDown 事件→KeyPress 事件→KeyUp 事件 6.鼠标事件

鼠标是我们常用的输入工具,代替健登而使操作更方便,更灵活。VsBs 提低的鼠标事件共有7个,分别是Ciek.DbClick,MouseDown..MouseMowe,MouseUp Dr花Dep和DragOver. (I)MouseDown.MlouseMove、MouseUp事t件 MouseDown事件:按下假标任意键时产生 MouseMowve事件,按下佩标任意健。并移动鼠标时产生, Mo©Up事作:放开献标任意键时产生, 以窗体为例,3个事件的语法如下: Private Sub Form_MouseDown(Button As Integer,Shift As Imeger,X As Single,_ Y As Single) 语句组 End Sub Private Sub Form_MouseMove(Button As Integer,Shif As Integer,X As Single, YAs Single) 语句组 End Sub Private Sub Form_MouseUp(Button As Ineger,Shift As Integer.X As Single._ YAs Single) 语句组 End Sub 由上可见,上述3个事件的参数都是一样的,说明知下: ·Bun参数:表示按下的鼠标是厚一个键。1表示按下鼠标左键,2表示按下 鼠标右键,4表示按下鼠标的中阿健, ●Shn参数:是一个整数值,其取值的含义见表4-2, ·X、Y参数:表示限标光标所在的坐标值。 (2)DragDrop事件 按住鼠标拖动对象A到对象B,当松开限标放下对象A时,对象B产生DgDr即(拖 放)事件.例如把一个图片燕放到窗体的任一位置,在放开鼠标时,该窗体就发生了DragDrop 事作。对于窗体,DragDrop事件的语法如下: Private Sub Form_DragDrop(Source As Control,X As Single.Y As Single) 语句组 EndSub 其中: 参数Source:表示棱拖动的对象。注意在界而设置时,应考被指动对象的DragMode属 性设置为1(表示设置指动模式为自动)1 参数X,Y:表示松开鼠标时,鼠标指针光标的位置坐标, 例7在窗体上对一字符进行痴故。 创建窗体,在窗体上添加一个命令按钮Commandl,.将其Caption属性值设为Visual Bse,DragMode属性设置为1(设置指动模式为自动),然后在窗体的DragDrop事件上添 加如下代码: Private Suh Form_DragDrop(Source As Control,X As Single,Y As Single)
10 鼠标是我们常用的输入工具,代替键盘而使操作更方便、更灵活。 Visual Basic 提供的鼠标事件共有 7 个,分别是 Click、DbClick、MouseDown、MouseMove、MouseUp、 DragDrop 和 DragOver。 (1)MouseDown、MouseMove、MouseUp 事件 MouseDown 事件:按下鼠标任意键时产生 MouseMove 事件:按下鼠标任意键,并移动鼠标时产生。 MouseUp 事件:放开鼠标任意键时产生。 以窗体为例,3 个事件的语法如下: Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, _ Y As Single) 语句组 End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, _ Y As Single) 语句组 End Sub Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, _ Y As Single) 语句组 End Sub 由上可见,上述 3 个事件的参数都是一样的,说明如下: ⚫ Button 参数:表示按下的鼠标是哪一个键。1 表示按下鼠标左键,2 表示按下 鼠标右键,4 表示按下鼠标的中间键。 ⚫ Shift 参数:是一个整数值,其取值的含义见表 4-2。 ⚫ X、Y 参数:表示鼠标光标所在的坐标值。 (2)DragDrop 事件 按住鼠标拖动对象 A 到对象 B,当松开鼠标放下对象 A 时,对象 B 产生 DragDrop(拖 放)事件。例如把一个图片拖放到窗体的任一位置,在放开鼠标时,该窗体就发生了 DragDrop 事件。对于窗体,DragDrop 事件的语法如下: Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single) 语句组 End Sub 其中: 参数 Source:表示被拖动的对象。注意在界面设置时,应将被拖动对象的 DragMode 属 性设置为 1(表示设置拖动模式为自动); 参数 X、Y:表示松开鼠标时,鼠标指针光标的位置坐标。 例 7 在窗体上对一字符进行拖放。 创建窗体,在窗体上添加一个命令按纽 Command1,将其 Caption 属性值设为 Visual Basic,DragMode 属性设置为 1(设置拖动模式为自动)。然后在窗体的 DragDrop 事件上添 加如下代码: Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)