1、第第9章章 键盘与鼠标事件过程键盘与鼠标事件过程9.1键盘事件键盘事件9.2鼠标事件鼠标事件9.3 鼠标属性鼠标属性9.4 拖放拖放9.5 小结小结第第9章章 键盘与鼠标事件过程键盘与鼠标事件过程近年来,尽管语音识别输入、手写识别输入等技近年来,尽管语音识别输入、手写识别输入等技术发展迅速,但是鼠标和键盘仍然是人们操纵计术发展迅速,但是鼠标和键盘仍然是人们操纵计算机的主要工具。对鼠标器和键盘进行编程是程算机的主要工具。对鼠标器和键盘进行编程是程序设计人员必须掌握的基本技术。序设计人员必须掌握的基本技术。VB应用程序除了能响应鼠标的单击(应用程序除了能响应鼠标的单击(Click)和双)和双击(击
2、(DbClick)事件外,还能响应多种鼠标事件和)事件外,还能响应多种鼠标事件和键盘事件。本章主要介绍了键盘事件。本章主要介绍了VB对象能够识别的三对象能够识别的三种键盘事件:种键盘事件:KeyPress、KeyDown、KeyUp事事件和三个鼠标事件:件和三个鼠标事件:MouseDown、MouseUp、MouseMove事件。事件。第第9章章 键盘与鼠标事件过程键盘与鼠标事件过程通过本章的学习,我们可以对学生信息管理系统通过本章的学习,我们可以对学生信息管理系统中窗体上的对象编写其键盘和鼠标事件过程代码,中窗体上的对象编写其键盘和鼠标事件过程代码,从而使该应用程序能够响应多种键盘和鼠标事件
3、。从而使该应用程序能够响应多种键盘和鼠标事件。此外,此外,VB应用程序还可同时支持事件驱动的拖放应用程序还可同时支持事件驱动的拖放功能和功能和OLE的拖放功能。本章介绍了的拖放功能。本章介绍了VB提供的用提供的用于鼠标拖放操作处理的于鼠标拖放操作处理的DragMode和和DragIcon属属性、性、Drag方法、方法、DragOver和和DragDrop事件。同事件。同时,简要介绍了时,简要介绍了VB所支持的所支持的OLE拖放的实现方法。拖放的实现方法。9.1键盘事件键盘事件键盘事件是由键入键盘按键产生的。对于接受文本输入的控键盘事件是由键入键盘按键产生的。对于接受文本输入的控件,如文本框,通
4、常需要控制文本框中输入的内容,处理件,如文本框,通常需要控制文本框中输入的内容,处理ASCII字符,这就需要对键盘事件编程。字符,这就需要对键盘事件编程。在在VB中,对象识别的键盘事件有以下三种:中,对象识别的键盘事件有以下三种:KeyPress事件:用户按下并释放一个会产生事件:用户按下并释放一个会产生ASCII码的键码的键时被触发。时被触发。KeyUp事件:用户按下键盘上任意一个键时被触发。事件:用户按下键盘上任意一个键时被触发。KeyDown事件:用户释放键盘上任意一个键时被触发。事件:用户释放键盘上任意一个键时被触发。9.1键盘事件键盘事件 KeyPress事件当用户按下和松开一个事件
5、当用户按下和松开一个ASCII字符键时发生。字符键时发生。该事件发生时,被按键的该事件发生时,被按键的ASCII码将自动传递给事件过程的码将自动传递给事件过程的KeyAscii参数。在程序中,通过访问该参数,即可获知用户参数。在程序中,通过访问该参数,即可获知用户按下了哪一个键,并可识别字母的大小写。按下了哪一个键,并可识别字母的大小写。KeyPress事件过事件过程形式如下:程形式如下:窗体的窗体的KeyPress事件过程:事件过程:Private Sub Form_KeyPress(KeyAscii As Integer)End Sub窗体上控件的窗体上控件的KeyPress事件过程:事件
6、过程:Private Sub Object_KeyPress(Index As Integer,KeyAscii As Integer)End Sub9.1键盘事件键盘事件 其中:其中:Index:是一个整数,用来唯一标识一个在控件数组中的:是一个整数,用来唯一标识一个在控件数组中的控件;控件;KeyAscii:是被按下字符键的标准:是被按下字符键的标准ASCII码。码。KeyAscii通过引用通过引用传递,对它进行改变可给对象发送一个不同的字符。将传递,对它进行改变可给对象发送一个不同的字符。将KeyAscii改变为改变为0时可取消击键,这样一来对象便接收不到所键时可取消击键,这样一来对象便
7、接收不到所键的字符。的字符。在默认情况下,当用户对当前具有控制焦点的对象进行按下并释在默认情况下,当用户对当前具有控制焦点的对象进行按下并释放的键盘操作时,直接触发该对象的放的键盘操作时,直接触发该对象的KeyPress事件,窗体本身事件,窗体本身不会接收到该事件。但是,当把窗体的不会接收到该事件。但是,当把窗体的KeyPreview属性被设置属性被设置为为True时,窗体将先于该窗体上的控件接收该事件,窗体接收到时,窗体将先于该窗体上的控件接收该事件,窗体接收到该事件后控件将继续接收该事件。利用这一点,在窗体级事件过该事件后控件将继续接收该事件。利用这一点,在窗体级事件过程中修改了程中修改了
8、KeyAscii变量的值,则当前选中对象的变量的值,则当前选中对象的KeyPress事事件将接收到修改后的键盘码,如果窗体级事件过程将件将接收到修改后的键盘码,如果窗体级事件过程将KeyAscii设置为设置为0,则不再调用对象的,则不再调用对象的KeyPress事件过程。事件过程。9.1键盘事件键盘事件 说明:说明:(1)KeyPress事件只对会产生事件只对会产生ASCII码的按键有反应,包括码的按键有反应,包括数字、大小写的字母、标点符号、数字、大小写的字母、标点符号、Enter、BackSpace、Esc、Tab等。对于如方向键这样的不会产生等。对于如方向键这样的不会产生ASCII码的按
9、键,码的按键,KeyPress事件不会被触发。事件不会被触发。(2)在默认情况下,具有焦点的对象才能接收该事件。一个)在默认情况下,具有焦点的对象才能接收该事件。一个窗体只有在不具有可视的和有效的控件时或窗体只有在不具有可视的和有效的控件时或KeyPreview属性属性被设置为被设置为True时才能接收该事件。时才能接收该事件。KeyPress事件常用于编写文本框的事件处理器,因为这个事事件常用于编写文本框的事件处理器,因为这个事件发生在字符按下和显示在文本框之前。利用该事件,可以对件发生在字符按下和显示在文本框之前。利用该事件,可以对文本框输入的数据进行限制。文本框输入的数据进行限制。9.1
10、键盘事件键盘事件 例如,在学生信息管理系统的例如,在学生信息管理系统的“添加学籍信息添加学籍信息”窗体窗体frmAddEss上有一个用于输入学生学号的文本框上有一个用于输入学生学号的文本框txtSID,如图,如图9-1所示。其所示。其KeyPress事件过程代码如下:事件过程代码如下:Private Sub txtSID_KeyPress(KeyAscii As Integer)学号文本框学号文本框 按键非数字或回删键,取消按键非数字或回删键,取消 If Not IsNumeric(Chr(KeyAscii)And KeyAscii 8 Then KeyAscii=0 End IfEnd Su
11、b则该文本框只能接收则该文本框只能接收09的数字字符和回删键。如果输入了的数字字符和回删键。如果输入了其他字符,则将其其他字符,则将其KeyAscii更改为更改为0,使控件最后接收到的是,使控件最后接收到的是KeyAscii=0的字符(空字符,不等于空格字符),这样就抑制的字符(空字符,不等于空格字符),这样就抑制了那些字符的输入。了那些字符的输入。9.1键盘事件键盘事件 txtSID图图9-1 KeyPress事件的用法事件的用法9.1键盘事件键盘事件 学生信息管理系统的学生信息管理系统的“修改成绩修改成绩”窗体窗体frmModiGrade上的上的用于输入学生成绩的文本框用于输入学生成绩的文
12、本框txtGrade,如图,如图9-2所示。其所示。其KeyPress事件过程代码与事件过程代码与txtSID的相同,也是利用该事件,的相同,也是利用该事件,实现对实现对txtGrade输入的数据进行限制。输入的数据进行限制。txtGrade图图9-2 KeyPress事件的用法事件的用法9.1键盘事件键盘事件 KeyPress事件除了可以对文本框输入的数据进行限制外,还事件除了可以对文本框输入的数据进行限制外,还可以用来对文本框输入的数据进行修改,控件接收的是经过可以用来对文本框输入的数据进行修改,控件接收的是经过修改后的数据。例如,如果希望将文本框修改后的数据。例如,如果希望将文本框Tex
13、t1中的所有字符中的所有字符都强制转换为大写字符,则其都强制转换为大写字符,则其KeyPress事件过程代码如下:事件过程代码如下:Private Sub Text1_KeyPress(KeyAscii As Integer)KeyAscii=Asc(UCase(Chr(KeyAscii)End Sub当控制焦点置于某对象上,同时用户按下键盘上的任一键,当控制焦点置于某对象上,同时用户按下键盘上的任一键,便会对相应对象触发便会对相应对象触发KeyDown事件,释放按键便触发相应对事件,释放按键便触发相应对象的象的KeyUp事件。与事件。与KeyPress事件不同,事件不同,KeyUp和和Key
14、Down事件返回的是被按下或释放的键盘扫描码和组合键事件返回的是被按下或释放的键盘扫描码和组合键的状态。其事件过程形式如下:的状态。其事件过程形式如下:Private Sub Form_KeyDown(KeyCode As Integer,Shift As Integer)End SubPrivate Sub Object_KeyDown(Index As Integer,KeyCode As Integer,Shift As Integer)End SubPrivate Sub Form_KeyUp(KeyCode As Integer,Shift As Integer)End SubPri
15、vate Sub Object_KeyUp(Index As Integer,KeyCode As Integer,Shift As Integer)End Sub9.1键盘事件键盘事件 其中:其中:KeyCode:是用户所按键的扫描码。它告诉事件过程用户所按:是用户所按键的扫描码。它告诉事件过程用户所按键的物理键位,因此通过该参数不能区分字母大小写。因为同键的物理键位,因此通过该参数不能区分字母大小写。因为同一字母的大小写均是由同一字母键键入的,其一字母的大小写均是由同一字母键键入的,其KeyCode相同,相同,为此字母的大写字符的为此字母的大写字符的ASCII码。对于有上档字符和下档字符码
16、。对于有上档字符和下档字符的键,其的键,其KeyCode也是相同的,为下档字符的也是相同的,为下档字符的ASCII码。码。对对KeyCode参数的测试,可以通过相应的参数的测试,可以通过相应的ASCII码,也可使用码,也可使用键码常数,如:键码常数,如:vbKeyF1(F1键)、键)、vbKeyHome(Home键)、键)、vbKeyLeft(方向键)、方向键)、vbKeyUp(方向键)。方向键)。9.1键盘事件键盘事件 其中:其中:Shift:是一个整数,用来标明在该事件发生时是否还同时按:是一个整数,用来标明在该事件发生时是否还同时按了了Shift、Ctrl和和Alt这三个控制键。它是具有
17、相这三个控制键。它是具有相应于应于Shift键(位键(位0),),Ctrl键(位键(位1)以及)以及Alt键键(位(位2)最少二进制位的一个位字段。对应位为)最少二进制位的一个位字段。对应位为1表示相应键表示相应键被按下,为被按下,为0表示该键未被按下。由此,表示该键未被按下。由此,Shift参数的值等于参数的值等于1、2和和4分别表示分别表示Shift、Ctrl和和Alt键被按下。若键被按下。若Ctrl和和Alt被同时按下,则被同时按下,则Shift参数的值为参数的值为6(二进制(二进制的的110)。因此,可结合该参数项来判断输入字母的大小写。)。因此,可结合该参数项来判断输入字母的大小写。
18、图图9-3说明了说明了Shift参数与位的关系。参数与位的关系。Shift参数与位的组合见表参数与位的组合见表9-1。9.1键盘事件键盘事件 图图9-3 Shift参数与位的关系参数与位的关系9.1键盘事件键盘事件 SCA高位低位Alt键Ctrl键Shift键210表表9-1 Shift参数与位的组合参数与位的组合9.1键盘事件键盘事件 Shift参数值内部常数说明0(二进制000)没有键被按下1(二进制001)vbShiftMaskShift键被按下2(二进制010)vbCtrlMaskCtrl键被按下3(二进制011)vbShiftMask+vbCtrlMask Shift键、Ctrl键被
19、按下4(二进制100)vbAltMaskAlt键被按下5(二进制101)vbShiftMask+vbAltMaskShift键、Alt键被按下6(二进制110)vbCtrlMask+vbAltMaskCtrl键、Alt键被按下7(二进制111)vbCtrlMask+vbAltMask+vbShiftMaskShift键、Ctrl键、Alt键被按下下面的代码使用下面的代码使用Shift参数判断是否按下了字母的大写形式。参数判断是否按下了字母的大写形式。Private Sub Text1_KeyDown(KeyCode As Integer,Shift As Integer)If KeyCode=
20、vbKeyA And Shift=1 Then MsgBox 你按了大写字母你按了大写字母A键键End Sub在上述代码中,对在上述代码中,对Shift参数的测试,也可使用系统定义的内参数的测试,也可使用系统定义的内部常数。即写成如下形式:部常数。即写成如下形式:Private Sub Text1_KeyDown(KeyCode As Integer,Shift As Integer)If KeyCode=vbKeyA And Shift=vbShiftMask Then MsgBox 你按了大你按了大写字母写字母A键键End Sub说明:说明:(1)对于这两个事件来说,带焦点的对象都能接收所
21、有按键。)对于这两个事件来说,带焦点的对象都能接收所有按键。一个窗体只有在不具有可视的和有效的控件时才可以获得焦一个窗体只有在不具有可视的和有效的控件时才可以获得焦点。点。9.1键盘事件键盘事件(2)键不能触发键不能触发KeyUp和和KeyDown事件;命令按钮事件;命令按钮的的Default属性设置为属性设置为True时,时,键不能触发键不能触发KeyUp和和KeyDown事件;命令按钮的事件;命令按钮的Cancel属性设置为属性设置为True时,时,键不能触发键不能触发KeyUp和和KeyDown事件。事件。(3)对于任何不被)对于任何不被KeyPress识别的按键应当使用识别的按键应当使
22、用KeyUp和和KeyDown事件过程来处理,如按下功能键、编辑键、定位键事件过程来处理,如按下功能键、编辑键、定位键以及任何这些键和键盘换档键的组合等。与以及任何这些键和键盘换档键的组合等。与KeyUp和和KeyDown事件不同的是,事件不同的是,KeyPress事件不显示键盘的物理事件不显示键盘的物理状态,而只是传递一个字符。表状态,而只是传递一个字符。表9-2列出了列出了KeyPress与与KeyDown及及KeyUp事件的详细区别。事件的详细区别。9.1键盘事件键盘事件(2)键不能触发键不能触发KeyUp和和KeyDown事件;命令按钮事件;命令按钮的的Default属性设置为属性设置
23、为True时,时,键不能触发键不能触发KeyUp和和KeyDown事件;命令按钮的事件;命令按钮的Cancel属性设置为属性设置为True时,时,键不能触发键不能触发KeyUp和和KeyDown事件。事件。(3)对于任何不被)对于任何不被KeyPress识别的按键应当使用识别的按键应当使用KeyUp和和KeyDown事件过程来处理,如按下功能键、编辑键、定位键事件过程来处理,如按下功能键、编辑键、定位键以及任何这些键和键盘换档键的组合等。与以及任何这些键和键盘换档键的组合等。与KeyUp和和KeyDown事件不同的是,事件不同的是,KeyPress事件不显示键盘的物理事件不显示键盘的物理状态,
24、而只是传递一个字符。表状态,而只是传递一个字符。表9-2列出了列出了KeyPress与与KeyDown及及KeyUp事件的详细区别。事件的详细区别。9.1键盘事件键盘事件【例例9-1】本例说明本例说明KeyDown和和KeyUp的用法。在窗体上设的用法。在窗体上设置四个标签、两个文本框、三个复选框、一个命令按钮。程置四个标签、两个文本框、三个复选框、一个命令按钮。程序运行界面如图序运行界面如图9-4所示。所示。9.1键盘事件键盘事件 图图9-4 KeyDown和和KeyUp的用法的用法程序代码如下:程序代码如下:Private Sub Form_Activate()Text1.SetFocus
25、End Sub文本(输入)框文本(输入)框Text1的的Keydown事件过程代码:事件过程代码:Private Sub Text1_Keydown(KeyCode As Integer,Shift As Integer)Text2.Text=Text2.Text&Str(KeyCode)&,If KeyCode 111 And KeyCode 0,1,0)Check2.Value=IIf(Shift And vbCtrlMask)0,1,0)Check3.Value=IIf(Shift And vbAltMask)0,1,0)End Sub9.1键盘事件键盘事件 9.1键盘事件键盘事件 上述
26、事件过程的上述事件过程的流程图如图所示流程图如图所示:开始结束Text2.Text=Text2.Text&Str(KeyCode)&,KeyCode 111 And KeyCode 0,1,0)Check2.Value=IIf(Shift And vbCtrlMask)0,1,0)Check3.Value=IIf(Shift And vbAltMask)0,1,0)FT为了检测为了检测Shift键是否被按下,上述代码使用键是否被按下,上述代码使用Shift And vbShiftMask是否大于是否大于0作为测试条件,即将作为测试条件,即将Shift参数与位屏参数与位屏蔽常数进行蔽常数进行An
27、d(逻辑与)运算。若运算结果大于零,则说(逻辑与)运算。若运算结果大于零,则说明该键被按下。对明该键被按下。对Ctrl和和Alt键的检测方法与此类似。键的检测方法与此类似。“清除清除”命令按钮命令按钮Command1的的Click事件过程代码:事件过程代码:Private Sub Command1_Click()Text1.Text=Text2.Text=Text1.SetFocusCheck1.Value=0 Check2.Value=0 Check3.Value=0Label4.Visible=FalseEnd Sub9.1键盘事件键盘事件 VB对象能够识别的这三种键盘事件彼此并不相互排斥
28、。当按对象能够识别的这三种键盘事件彼此并不相互排斥。当按下某键时将触发下某键时将触发KeyDown和和KeyPress事件,而松开此键后事件,而松开此键后触发触发KeyUp事件。当用户按下一个事件。当用户按下一个KeyPress不能检测的键时不能检测的键时将触发将触发KeyDown事件,而松开此键后触发事件,而松开此键后触发KeyUp事件。事件。此外,对于此外,对于键,除非窗体上的每个控件都无效或其键,除非窗体上的每个控件都无效或其TabStop都为都为False,否则,否则,键会将焦点从一个控件移键会将焦点从一个控件移动到另一个控件而不触发键盘事件。同样,如果已为菜单控动到另一个控件而不触发
29、键盘事件。同样,如果已为菜单控件定义快捷键,那么,当按下该键时会自动触发菜单控件的件定义快捷键,那么,当按下该键时会自动触发菜单控件的Click事件,键盘事件将不触发。事件,键盘事件将不触发。9.1键盘事件键盘事件 9.2 鼠标事件鼠标事件鼠标事件是由用户操作鼠标而触发的能被鼠标事件是由用户操作鼠标而触发的能被VB中的各种对象中的各种对象识别的事件。除了识别的事件。除了Click和和DbClick事件之外,还有三个事件:事件之外,还有三个事件:MouseDown、MouseUp和和MouseMove事件。事件。Click和和DbClick事件只能识别鼠标按下或双击按下的动作,可通过事件只能识别
30、鼠标按下或双击按下的动作,可通过MouseDown、MouseUp和和MouseMove事件使应用程序对事件使应用程序对鼠标位置及状态的变化作出响应(其中不包括拖动事件,后鼠标位置及状态的变化作出响应(其中不包括拖动事件,后面的面的“拖放拖放”一节中将介绍拖放事件)。大多数控件都能识一节中将介绍拖放事件)。大多数控件都能识别这些事件。别这些事件。MouseDown和和MouseUp事件是当按下或者释放鼠标按钮时事件是当按下或者释放鼠标按钮时被触发。其事件过程形式如下(以被触发。其事件过程形式如下(以Form对象为例):对象为例):Private Sub Form_MouseDown(Butto
31、n As Integer,Shift As Integer,X As Single,Y As Single)End SubPrivate Sub Form_MouseUp(Button As Integer,Shift As Integer,X As Single,Y As Single)End Sub9.2 鼠标事件鼠标事件 其中:其中:Button:返回一个整数,用来标识该事件的发生是按下:返回一个整数,用来标识该事件的发生是按下(MouseDown)或者释放()或者释放(MouseUp)鼠标按钮引起的。)鼠标按钮引起的。它是具有相应于左按钮(位它是具有相应于左按钮(位0),右按钮(位),
32、右按钮(位1)以及中间按)以及中间按钮(位钮(位2)最少二进制位的一个位字段。由此,)最少二进制位的一个位字段。由此,Button参数的参数的值等于值等于1、2和和4分别表示左按钮,右按钮和中间按钮被按下。分别表示左按钮,右按钮和中间按钮被按下。图图9-6说明了说明了Button参数与位的关系。参数与位的关系。Button参数与位的组合参数与位的组合见表见表9-3。9.2 鼠标事件鼠标事件 LRM高位低位中间按钮右按钮左按钮2109.2 鼠标事件鼠标事件 Button参数值内部常数说明0(二进制000)没有按钮被按下1(二进制001)vbLeftButton左按钮被按下2(二进制010)vbR
33、ightButton右按钮被按下3(二进制011)vbLeftButton+vbRightButton左按钮、右按钮被按下4(二进制100)vbMiddleButton中间按钮被按下5(二进制101)vbLeftButton+vbRightButton左按钮、中间按钮被按下6(二进制110)vbRightButton+vbMiddleButton右按钮、中间按钮被按下7(二进制111)vbLeftButton+vbRightButton+vbMiddleButton左按钮、中间按钮、右按钮被按下Shift:与键盘事件该参数的意义相同,它返回一个整数,在:与键盘事件该参数的意义相同,它返回一个整
34、数,在Button参数指定的按钮被按下或者被释放的情况下,该整数参数指定的按钮被按下或者被释放的情况下,该整数相应于相应于、和和键的状态。键的状态。X,Y:返回鼠标指针的当前位置,其值由该对象的:返回鼠标指针的当前位置,其值由该对象的ScaleHeight、ScaleWidth、ScaleLeft和和ScaleTop属性所建属性所建立的坐标系统确定。立的坐标系统确定。说明:说明:为了给在一个鼠标按钮被按下或被释放时指定将引起的一些为了给在一个鼠标按钮被按下或被释放时指定将引起的一些操作,应当使用操作,应当使用MouseDownh或者或者MouseUp事件。不同于事件。不同于Click和和DbC
35、lick事件,事件,MouseDownh和和MouseUp事件能够事件能够区分出鼠标的左、右和中间按钮。区分出鼠标的左、右和中间按钮。9.2 鼠标事件鼠标事件 MouseMove事件是当移动鼠标时被触发。其事件过程形式如事件是当移动鼠标时被触发。其事件过程形式如下(以下(以Form对象为例):对象为例):Private Sub Form_MouseMove(Button As Integer,Shift As Integer,X As Single,Y As Single)End Sub其中参数描述同其中参数描述同MouseDownh和和MouseUp事件。事件。说明:说明:MouseMove
36、事件伴随鼠标指针在对象上移动时连续不断地发事件伴随鼠标指针在对象上移动时连续不断地发生。那么当鼠标指针在对象上移过一定距离时要调用多少次生。那么当鼠标指针在对象上移过一定距离时要调用多少次MouseMove事件呢?事件呢?VB系统并不是对鼠标指针经过的每个系统并不是对鼠标指针经过的每个像素都会触发像素都会触发MouseMove事件,只是每秒生成有限个鼠标消事件,只是每秒生成有限个鼠标消息,从而触发有限个鼠标事件。息,从而触发有限个鼠标事件。9.2 鼠标事件鼠标事件【例【例9-2】使用鼠标事件】使用鼠标事件MouseDown、MouseUp和和MouseMove,设计一个直接用鼠标画图的简单画图
37、程序。当,设计一个直接用鼠标画图的简单画图程序。当鼠标任意键被按下时启动绘图状态,这时,当用户按下鼠标鼠标任意键被按下时启动绘图状态,这时,当用户按下鼠标左键并移动时绘制红色图形;而按下鼠标右键并移动时绘制左键并移动时绘制红色图形;而按下鼠标右键并移动时绘制蓝色图形。而当鼠标按键被释放时,禁止绘图功能。蓝色图形。而当鼠标按键被释放时,禁止绘图功能。程序代码如下:程序代码如下:Dim DrawState As Boolean 绘图状态开关变量绘图状态开关变量Private Sub Form_MouseDown(Button As Integer,Shift As Integer,X As Sin
38、gle,Y As Single)DrawState=True 启动绘图状态启动绘图状态 CurrentX=X CurrentY=YEnd Sub9.2 鼠标事件鼠标事件 Private Sub Form_MouseMove(Button As Integer,Shift As Integer,X As Single,Y As Single)If DrawState And Button=1 Then 在绘图状态下用鼠标左键绘制红色图形在绘图状态下用鼠标左键绘制红色图形 Line-(X,Y),RGB(255,0,0)从当前坐标到(从当前坐标到(X,Y)画红色直线)画红色直线Circle(X,Y)
39、,50,RGB(255,0,0)以(以(X,Y)为圆心,画半径为)为圆心,画半径为50Twips的红的红色圆色圆 ElseIf DrawState And Button=2 Then 在绘图状态下用鼠标右键绘制蓝色在绘图状态下用鼠标右键绘制蓝色图形图形 Line-(X,Y),RGB(0,0,255)从当前坐标到(从当前坐标到(X,Y)画蓝色直线)画蓝色直线Circle(X,Y),50,RGB(0,0,255)以以(X,Y)为圆心,画半径为为圆心,画半径为50Twips的蓝色圆的蓝色圆 End IfEnd Sub9.2 鼠标事件鼠标事件 9.2 鼠标事件鼠标事件 开始结束 DrawState A
40、nd Button=1 Line-(X,Y),RGB(0,0,255)Circle(X,Y),50,RGB(0,0,255)Line-(X,Y),RGB(255,0,0)Circle(X,Y),50,RGB(255,0,0)TF DrawState And Button=2TF图图9-7 Form_MouseMove事件过程流程图事件过程流程图Private Sub Form_MouseUp(Button As Integer,Shift As Integer,X As Single,Y As Single)DrawState=False 禁止绘图状态禁止绘图状态End Sub程序运行结果如图
41、程序运行结果如图9-8所示。所示。9.2 鼠标事件鼠标事件 在程序运行时,可以发现,当鼠标指针移动得很快时,在相同长在程序运行时,可以发现,当鼠标指针移动得很快时,在相同长度线段间画出的圆的个数比较少,说明在等长度线段间能识别的度线段间画出的圆的个数比较少,说明在等长度线段间能识别的MouseMove事件数就少。相反,当鼠标指针移动得很慢时,在相事件数就少。相反,当鼠标指针移动得很慢时,在相同长度线段间画出的圆的个数比较多,说明在等长度线段间能识同长度线段间画出的圆的个数比较多,说明在等长度线段间能识别的别的MouseMove事件数就多。由于系统能在短时间内识别大量的事件数就多。由于系统能在短
42、时间内识别大量的MouseMove事件,因此,不应使用事件,因此,不应使用MouseMove事件过程去做那事件过程去做那些需要大量计算时间的工作。些需要大量计算时间的工作。在设计程序时,需要特别注意的是,这些事件被什么对象识别,在设计程序时,需要特别注意的是,这些事件被什么对象识别,即事件发生在什么对象上。当鼠标指针位于窗体中没有控件的区即事件发生在什么对象上。当鼠标指针位于窗体中没有控件的区域时,窗体将识别鼠标事件。当鼠标指针位于某个控件上方时,域时,窗体将识别鼠标事件。当鼠标指针位于某个控件上方时,该控件将识别鼠标事件。如果按下鼠标按钮不放,则对象将继续该控件将识别鼠标事件。如果按下鼠标按
43、钮不放,则对象将继续识别所有鼠标事件,直到用户释放按钮。即使此时鼠标指针已移识别所有鼠标事件,直到用户释放按钮。即使此时鼠标指针已移离对象,情况也是如此。这暗示了通过鼠标事件所返回的离对象,情况也是如此。这暗示了通过鼠标事件所返回的X,Y鼠鼠标指针坐标值,可以不总是在接收它们的对象的内部区域之内。标指针坐标值,可以不总是在接收它们的对象的内部区域之内。9.2 鼠标事件鼠标事件 9.3 鼠标属性鼠标属性在在VB中,可以通过两个属性设置来改变鼠标指针的形状。中,可以通过两个属性设置来改变鼠标指针的形状。这两个属性就是这两个属性就是MousePointer属性和属性和MouseIcon属性。大属性。
44、大部分控件都具有这两个属性。部分控件都具有这两个属性。MousePointer属性可以用来定义显示各种鼠标指针。鼠标指属性可以用来定义显示各种鼠标指针。鼠标指针的改变可以告知用户诸多信息,例如,系统正在进行长时针的改变可以告知用户诸多信息,例如,系统正在进行长时间的后台处理,可以调整某个控件或窗口的大小,某控件不间的后台处理,可以调整某个控件或窗口的大小,某控件不支持拖放操作等。支持拖放操作等。鼠标指针的定义格式如下:鼠标指针的定义格式如下:Object.MousePointer=value其中,其中,value的设定值见表的设定值见表9-4。默认设定值为。默认设定值为0-Default,显,
45、显示为标准的示为标准的Windows箭头指针。如果需要在应用程序中控制箭头指针。如果需要在应用程序中控制鼠标指针,就要改变控件的鼠标指针,就要改变控件的MousePointer属性值,设定为合属性值,设定为合适的数值。适的数值。注意:在设置鼠标指针样式的同时,还应有相应的使鼠标指注意:在设置鼠标指针样式的同时,还应有相应的使鼠标指针恢复为默认值的语句。针恢复为默认值的语句。9.3 鼠标属性鼠标属性 9.3 鼠标属性鼠标属性 指针形状值内部常数描述0vbDefault(缺省值)形状由对象决定1vbArrow箭头2vbCrosshair十字线(crosshair指针)3vbIbeamI型4vbIc
46、onPointer图标(矩形内的小矩形)5vbSizePointer尺寸线(指向东、南、西和北四方向的箭头)6vbSizeNESW右上-左下尺寸线(指向东北和西南方向的双箭头)7vbSizeNS垂直尺寸线(指向南和北的双箭头)。表表9-4 MousePointer属性值及其说明属性值及其说明9.3 鼠标属性鼠标属性 指针形状值内部常数描述8vbSizeNWSE左上-右下尺寸线(指向东南和西北方向的双箭头)9vbSizeWE水平尺寸线(指向东和西两个方向的双箭头)10vbUpArrow向上的箭头11vbHourglass沙漏(表示等待状态)12vbNoDrop不允许放下13vbArrowHour
47、glass 箭头和沙漏14vbArrowQuestion箭头和问号15vbSizeAll四向尺寸线99vbCustom通过MouseIcon属性所指定的自定义图标当当MousePointer属性值被设定为属性值被设定为99时,还可以利用时,还可以利用MouseIcon属性自定义鼠标指针。属性自定义鼠标指针。MouseIcon属性提供了一属性提供了一个自定义图标,即该属性可以设置为一个图标文件。其使用个自定义图标,即该属性可以设置为一个图标文件。其使用格式如下:格式如下:Object.MouseIcon=LoadPicture(pathname)或或Object.MouseIcon=Pictur
48、e其中,其中,pathname指定包含自定义图标文件的路径和文件名。指定包含自定义图标文件的路径和文件名。Picture是是Form对象、对象、PictureBox控件或控件或Image控件的控件的Picture属性。属性。在将在将MousePointer属性值设定为属性值设定为99-Custom时,如果未利用时,如果未利用MouseIcon属性加载图标,则用默认的鼠标指针。同样,如属性加载图标,则用默认的鼠标指针。同样,如果未将果未将MousePointer属性值设定为属性值设定为99-Custom,则将忽略,则将忽略MouseIcon的设置。的设置。9.3 鼠标属性鼠标属性【例例9-3】本
49、例说明本例说明MouseIcon属性的作用。在窗体上设置一属性的作用。在窗体上设置一个图像控件个图像控件Image1,将该控件的,将该控件的Picture属性设置为属性设置为“ImageScenery.jpg”,MousePointer属性设置为属性设置为99,MouseIcon设置设置“ImageH-Point.ico”。程序运行界面如图。程序运行界面如图9-9所示。当鼠标指针移动到图像控件上时,指针鼠标立即改所示。当鼠标指针移动到图像控件上时,指针鼠标立即改变为一个手指形状(由变为一个手指形状(由H-Point.ico文件设置)。文件设置)。9.3 鼠标属性鼠标属性 图图9-9 鼠标指针的
50、变化鼠标指针的变化9.4 拖放拖放拖放是一种很重要的鼠标操作。拖放是一种很重要的鼠标操作。VB提供了提供了DragMode属性属性和和DragIcon属性、属性、DragOver事件和事件和DragDrop事件、事件、Drag方法等用于鼠标拖放操作的处理,如表方法等用于鼠标拖放操作的处理,如表9-5所示。所示。表表9-5 与拖放有关的属性、事件和方法与拖放有关的属性、事件和方法类别项目说明属性DragMode启动自动拖动控件或手动拖动控件DragIcon指定拖动控件时显示的图标事件DragDrop识别何时将控件拖动到对象上DragOver识别何时在对象上拖动控件方法Drag启动或停止手动拖动9