1、1,第5章 键盘与鼠标事件,【学习内容】Visual Basic是典型的可视化开发工具,采用事件驱动的开发模式。本章主要介绍键盘与鼠标的事件过程,以及在程序中如何实现鼠标指针的改变和拖放对象。要求掌握Windows程序设计中重要的事件驱动概念、键盘事件(KeyPress事件、KeyDown事件和KeyUp事件)、鼠标事件(MouseMove、MouseDown和MouseUp事件)、改变鼠标指针的形状和拖放及其相关的对象属性、事件和方法。,2,5.1 Visual Basic的事件驱动程序开发方式,5.1.1 事件驱动模型 在事件驱动的应用程序中,代码不是按照预定的路径执行,而是在响应不同的事
2、件时执行不同的代码片段。事件可以由用户操作触发.这些事件的顺序决定了代码执行的顺序,因此应用程序每次运行时所经过的代码的路径都是不尽相同的。 因为事件被触发的顺序是无法预测的,所以在代码中必须对执行时的“各种状态”作一定的假设。当作出某些假设时(例如,假设在运行处理某一输入字段的过程之前,该输入字段必须包含确定的值),应该组织好应用程序的结构,以确保该假设始终有效(例如,在输入字段中有值之前,禁止使用启动该处理过程的命令按钮)。,3,5.1.2 交互式开发Visual Basic在编程者输入代码时便进行解释,即时捕获并突出显示大多数语法或拼写错误。使编程感觉就像一位专家在监视代码的输入。 除即
3、时捕获错误以外,Visual Basic也在输入代码时部分地编译该代码。当准备运行和测试应用程序时,只需极短时间即可完成编译。如果编译器发现了错误,则将错误突出显示于代码中。这时可以更正错误并继续编译,而不需从头开始。 由于Visual Basic可以在开发应用程序时,频繁地编译和运行应用程序。通过这种方式,代码运行的效果可以在开发时进行测试,而不必等到编译完成以后。,4,5.1.3 事件驱动应用程序的工作方式事件是窗体或控件识别的动作。在响应事件时,事件驱动应用程序执行Visual Basic代码。Visual Basic的每一个窗体和控件都有一个预定义的事件集。如果其中有一个事件发生,而且
4、,在关联的事件过程中存在代码,则Visual Basic调用该代码。 尽管Visual Basic中的对象自动识别预定义的事件集,但要判定它们是否响应具体事件以及如何响应具体事件则是编程者的责任了。代码部分(即事件过程)与每个事件对应,当让控件响应事件时,就把代码写入这个事件的事件过程之中即可。,5,5.1.3 事件驱动应用程序的工作方式对象所识别的事件类型多种多样,但多数类型为大多数控件所共有。例如,大多数对象都能识别Click事件:如果单击窗体,则执行窗体的单击事件过程中的代码;如果单击命令按钮,则执行命令按钮的Click事件过程中的代码。 下面是事件驱动应用程序中的典型事件序列。 (1)
5、启动应用程序,装载和显示窗体。 (2)窗体(或窗体上的控件)接收事件。事件可由用户触发(例如键盘操作),也可由系统触发(例如定时器事件),也可由代码间接触发(例如当代码装载窗体时的Load事件)。 (3)如果在相应的事件过程中存在代码,就执行代码。 (4)应用程序等待下一次事件。,6,5.2 键 盘 事 件,5.2.1 KeyPress事件 当按下或松开键盘上的某个键时,将触发KeyPress事件。KeyPress事件主要用来接收数字、字母、Enter、Tab和Backspace等键的ASCII字符。KeyPress事件不显示键盘的物理状态(Shift键),而只是传递一个字符。当按下键盘上的某
6、个键时,触发的是获得焦点(FOCUS)的控件的KeyPress事件。在同一时刻,只能有一个控件获得焦点。如果窗体上没有活动的或可见的控件,则焦点位于窗体上。拥有获得焦点的对象(控件或窗体)可以接收从键盘上输入的信息。,7,5.2.2 KeyDown和KeyUp事件在程序运行过程中,当用户按下键盘上某个键时,触发KeyDown事件;当释放该键时,将触发KeyUp事件。与KeyPress事件不同,KeyDown和KeyUp事件返回的是键盘的直接状态,即该键的“扫描码”值。KeyDown和KeyUp事件可以处理不被KeyPress识别的特殊键,如F1F12的功能键、定位键以及这些键与Shift、Ct
7、rl、Alt特殊键的组合等。,8,5.2.2 KeyDown和KeyUp事件下面是一个应用文本框的KeyDown事件和KeyUp事件的程序代码: Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)If KeyCode = vbKeyA And Shift = 1 ThenMsgBox “你按下了大写字母A!“End If End Sub Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)If Shift = 4 ThenMsgBox “你松开了Al
8、t键!“End If End Sub,9,5.2.2 KeyDown和KeyUp事件,KeyDown和KeyUp事件的第一个参数可以有两种形式:一是Index As Integer(只用于控件数组);二是KeyCode As Integer(用于单个控件)。 KeyDown和KeyUp事件利用以下两种参数来解释每个字符的大小写形式。 Keycode显示用户按下或松开的键,视“A”和“a”为同一个键。KeyCode是按键的实际的ASCII码,以“键”为准,不以“字符”为准。 Shift显示Shift+Key键的状态。Shift转换键指的是3个转换键(Shift、Ctrl和Alt)的状态,这三个转
9、换键分别对应Shift值的低三位(当按下Shift键时,最低位为1)。通过Shift参数,可以判断用户是否按下了Shift、Ctrl和Alt键或者组合键.,10,5.3 鼠 标 事 件在Visual Basic应用程序中可以响应多种鼠标事件,大多数控件能够识别鼠标的MouseMove、MouseDown和MouseUp事件。通过响应这些鼠标事件,可以在应用程序中对鼠标位置以及状态的变化做出相应的操作。(1)当鼠标指针在屏幕上移动时就会触发鼠标的MouseMove事件,在Visual Basic应用程序中,当鼠标指针移动到窗体或者其他控件的边框内时,窗体和控件都能够识别MouseMove事件。,
10、11,5.3 鼠 标 事 件,1.窗体的MouseMove事件过程的语法格式如下: Private Sub Form_MouseMove(Button As Integer, Shift As Integer, _X As Single, Y As Single)Line -(X, Y) 移动鼠标时,会在窗体上上次位置与当前鼠标指针之间画线 End Sub2. 在这里,参数Button可以捕捉到用户按下的是哪一个鼠标键,具体参数值如表5-2所示。通过Shift参数还可以捕捉到用户在单击鼠标键时键盘的Shift、Ctrl和Alt键的状态。,12,5.3 鼠 标 事 件 (2)当用户按下任意鼠标键
11、时,就会触发鼠标的MouseDown事件。该事件是3种鼠标事件中使用最频繁的,可以用于在窗体上画图以及实现其他的图形效果,还可以在应用程序运行过程中改变控件在窗体中的位置。这3个鼠标事件可以识别和响应鼠标的各种状态,如在MouseDown事件中,可以识别用户按下哪一个鼠标键,还可以识别用户是否按下了Shift、Ctrl、Alt键或者它们的组合键。而鼠标的Click、DblClick事件只是一个单一的操作单击或者双击鼠标键操作。,13,5.3 鼠 标 事 件 窗体的MouseDown事件过程的语法格式如下:Private Sub Form_MouseDown(Button As Integer,
12、 Shift As Integer, _X As Single, Y As Single)Command1.Move X, Y 在窗体上单击时,将按钮移动到鼠标指针所在位置 End Sub Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _X As Single, Y As Single)If Button = 2 Then 判断用户如果单击鼠标右键,就弹出菜单mnuSavePopupMenu mnuSaveEnd If End Sub,14,5.3 鼠 标 事 件,(3)当用户释放任意鼠标键时,就会触发鼠标的Mo
13、useUp事件。上述3个事件往往搭配起来使用,以达到更好的效果。,15,5.4 鼠标指针的形状默认情况下,鼠标在窗体或者控件上面显示为指针的形状。在实际应用中,可以通过修改MousePointer属性来改变鼠标指针的形状。Visual Basic为该属性提供了16个可选的指针形状,每种指针都对应着一个整型数和VB常数。 通过设置鼠标指针形状,可以传递给用户更多的信息。例如,使用动画沙漏指针(vbHourglass)表示正在执行较长时间的任务,使用四向箭头型指针(vbSizeAll)表示用户可以调整窗口或者控件的大小等。,16,5.5 拖 放在设计Visual Basic应用程序时,经常使用控件
14、的拖放来调整其位置。而在程序的运行过程中也可以实现拖放,但通常情况下并不能自动改变控件位置,这就必须使用Visual Basic的拖放功能,通过编程,才能实现在运行时拖动控件并改变其位置。把按下鼠标按钮并移动控件的操作称为拖动,把释放按钮的操作称为放下。,17,5.5 拖 放 2、 (1)与拖放有关的对象属性。 DragMode设置拖放对象的模式(自动或人工)。 DragIcon设置拖动时被拖动控件的图标。(2)与拖放有关的事件。 当被拖放控件被放下时,目标对象产生DragDrop事件。 当被拖放对象越过某个对象时,该对象产生DragOver事件。(3)与拖放有关的方法。 Move表示把控件移动到某一位置。 Drag方法可人工启动或停止一个拖放过程。 与拖放相关的属性、事件和方法。,