第8章事件驱动程序设计8.1事件与事件驱动程序设计8.2常见键盘事件8.3常见鼠标事件8.1事件与事件驱动程序设计8.1.1事件程序的结构与驱动1.面向过程编程与事件驱动编程(1)面向过程编程用面向过程的语言编写的应用程序按照代码顺序运行,每次执行一行代码,执行过程中根据不同的代码语句,执行不同的逻辑分支或跳转到程序的其他部分。在面向过程编程中,程序负责控制用户如何输入信息。图8-1选择控制结构(a)流程图(b)N-S图真假PAB真P假AB(2)事件驱动编程在VisualBasic中编写的应用程序是事件驱动的。在基于事件驱动的应用程序中,只有当特定事件调用该事件所对应的代码时,程序语句才开始执行。键盘输入、鼠标事件、操作系统或程序代码都可以触发事件。事件驱动程序会持续检测和响应事件。事件发生时,如果与之对应的事件包含响应代码,VisualBasic就会执行这些代码。当单击窗体的“Button1”按钮时,将会触发鼠标单击(Click)事件,此时,VisualBasic运行过程SubButton1_Click中的代码。代码运行完后,VisualBasic等待下一个事件的发生,如图8-2所示。图8-2事件驱动编程示例下面是事件驱动应用程序中的典型事件序列。①启动应用程序,加载和显示窗体。②窗体(或窗体上的控件)接收事件。事件可由用户引发(例如鼠标操作),也可以由系统引发(例如定时器事件),还可由代码间接引发(例如,当代码加载窗体时的Load事件)。③如果在相应的事件过程中存在代码,就执行代码。④然后,应用程序等待下一次事件。2.VisualBasic窗体的常用事件(1)Activate事件(2)Click事件(3)DblClick事件(4)Deactivate事件(5)Initialize事件(6)Load事件(7)MouseDown事件(8)QueryUnload事件(9)Resize事件(10)Terminate事件(11)Unload事件8.1.2事件的驱动对象在这里的对象概念主要是指VisualBasic提供的现成对象,这也是VisualBasic的重要特征之一。VisualBasic中的对象主要分为窗体和控件两类。窗体是用户工作区,所有控件都在窗体中得到了集成,从而构成应用程序的界面;控件是指“空的对象”或基本对象,是应用程序的图形用户界面的一个组件,对其属性可以进行不同的设置,从而构成不同的对象。使用鼠标在某个控件上双击,即可将该控件复制到窗体中,通过对其属性的不同设置,可建立不同的应用程序。VisualBasic的工具箱如图8-3所示。图8-3VisualBasic工具箱命令按钮标签文本框在工具箱中的文本框控件上用鼠标双击,即可将该控件复制到窗体的正中央。然后,用鼠标指向窗体中的该控件,按下鼠标左键并移动鼠标,将该控件拖动到另一位置。用同样的方法可将标签和命令按钮控件复制到窗体中,如图8-4所示。图8-4窗体和控件8.2常见键盘事件8.2.1键盘事件的认识键盘是计算机的标准输入设备。键盘事件由键盘的键入产生。VisualBasic可以响应3种键盘事件:KeyDown事件、KeyUp事件和KeyPress事件利用键盘事件可以编程进行多种键盘操作,也可以处理ASCII值代表的字符。对键盘事件的处理可以分为两个层次:控件级和窗体级。注意,某些控件能够拦截键盘事件,以致窗体不能接收键盘事件。如命令按钮控件有焦点时的Enter键、焦点在列表框上时的方向键等。8.2.2KeyPress事件用户单击并松开一个ANSI标准键时,产生一个KeyPress事件。任何可打印的键盘字符,来自标准字母表的字符或少数几个特殊字符与Ctrl键的组合,回车键或空格键都可以触发KeyPress事件。KeyPress事件常用于文本框的事件处理。SubForm_Keypress(KeyAsciiAsInteger)'窗体的事件过程Subobject_KeyPress[IndexAsInteger,]KeyAsciiAsInteger)'窗体控件的事件过程其中,参数KeyAscii为按键的相对应的ASCII值。一般来说,当用户对当前具有控制焦点的对象进行按下并释放的键盘操作时,直接引发该对象的KeyPress事件。但是,如果窗体的KeyPreview属性设置为True,则首先触发窗体的KeyPress、KeyUp和KeyDown事件,利用这些事件过程可以先滤去一些信息,然后传送给对象的KeyPress、KeyUp和KeyDown事件。也就是说,如果窗体的KeyPreview属性设为True,并且窗体级事件过程修改了KeyAscii变量的值,则当前选中对象的KeyPress事件将接收到修改后的键盘码,如果窗体级事件过程将KeyAscii设置为0,则不再调用对象的KeyPress事件过程。利用KeyPress事件,可以对输入的数据进行限制。8.2.3KeyDown事件和KeyUp事件KeyDown和KeyUp事件是对键盘事件的最低级的反应。在焦点置于每个对象的条件下,用户单击键盘将出触发KeyDown,松开键盘时将触发KeyUp事件。KeyDown事件过程的语法格式:PrivateSub对象名_KeyDown(KeyCodeAsInteger,ShiftAsInteger)KeyUp事件过程的语法格式:PrivateSub对象名_KeyUp(KeyCodeAsInteger,ShiftAsInteger)注意,以下情况不能触发KeyDown和KeyUp事件:窗体有一个命令控件,并且Default属性设置为Ture时的Enter键;窗体有一个命令控件,并且Cancel属性设置为Ture时的Esc键;Tab键。8.3常见鼠标事件8.3.1鼠标事件的认识MouseDown、MouseUp和MouseMove事件是VisualBasic最常用的鼠标事件,大多数控件都可以识别这3个事件。单击鼠标时,将触发MouseDown事件;松开鼠标时,将触发MouseUp事件;鼠标移动到新位置时,将触发MouseMove事件。MouseDown事件过程的语法格式:PrivateSub对象名_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)MouseUp事件的语法格式:PrivateSub对象名_MouseUp(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)MouseMove事件的语法格式:PrivateSub对象名_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)注意:MouseDown和MouseUp事件所使用的参数与MouseMove事件使用的Button参数不同。MouseDown和MouseUp事件:Button参数要精确地指出每一个按钮的当前状态。MouseMove事件:Button参数指出所有按钮的当前状态。8.3.2Click事件与DoubleClick事件以鼠标左键单击对象时,将触发Click事件;以鼠标左键双击对象时,将触发DblClick事件。对于窗体对象,单击或双击一个空白区域或一个无效控件时触发Click事件和DblClick事件。Click事件过程的语法格式:PrivateSub对象名_Click()DblClick事件过程的语法格式:PrivateSub对象名_DblClick()8.3.3鼠标拖放事件用鼠标将一个对象拖动到另一个对象上时,无论鼠标是否松开,都会在目标对象上触发一个DragOver(拖动)事件。松开按钮后,还会触发一个DragDrop(拖放)事件。DragOver事件过程的语法格式:PrivateSub对象名_DragOver(SourceAsControl,XAsSingle,YAsSingle,StateAsInteger)DragDrop事件过程的语法格式:PrivateSub对象名_DragDrop(SourceAsControl,XAsSingle,YAsSingle)DragOver事件过程可确定拖动开始后和控件放在目标位置前发生的事情。DragOver事件过程可控制一个拖动操作完成后将发生的事情。注意:拖动前应首先确定开始拖动的方法。可通过设置DragMode属性和Drag方法实现。