
2.3 鼠标和键盘的事件过程
鼠标和键盘是应用程序与用户交互的主要工具,Visual Basic中对鼠标和键盘有独立的事件过程,对鼠标和键盘的事件过程编程是编写应用程序的最基本技术。
2.3.1 鼠标的事件过程
鼠标事件是由用户操作鼠标引发的能够被各种对象识别的事件。除了Click、DblClick事件之外,主要事件还有MouseDown、MouseUp和MouseMove等,这组事件在被触发时,会传递参数给事件过程。
·MouseDown事件:按下任意一个鼠标按钮时触发该事件。
·MouseUp事件:释放任意一个鼠标按钮时触发该事件。
·MouseMove事件:移动鼠标时触发该事件。
窗体以及窗体中的大多数对象都拥有这3个事件。如果单击某一个对象,会依次触发MouseDown、MouseUp和Click事件。
1.事件过程形式
与3个鼠标事件对应的事件过程为:

2.说明
(1)Button:指示用户按下或释放了哪个鼠标按钮。其值为“1”时,表示按下或释放鼠标左键;其值为“2”时,表示按下或释放鼠标右键;其值为“4”时,表示按下或释放鼠标中键。
(2)Shift参数:指示用户按下或释放鼠标的同时,【Shift】、【Ctrl】和【Alt】哪个或哪几个键同时被按下。其值为“1”时,表示按下【Shift】键;其值为“2”时,表示按下【Ctrl】键;其值为“4”时,表示按下【Alt】键。如果同时按下两个或三个控制键,则Shift参数值是相应键的数值之和,例如【Shift】的值为6,表示同时按下【Ctrl】键和【Alt】键。

图2-26 例2-11运行模式图
(3)X参数和Y参数:指示当前鼠标的位置。默认情况下,坐标系的圆点在引发事件对象的左上角。
【例2-11】利用鼠标的MouseDown、MouseUp和MouseMove事件,设计一个在窗体中自由绘制图形的应用程序。
【问题分析】DrawState变量表示鼠标在窗体中移动时是否画线,其作用域为模块级;PreX和PreY变量表示画线的起点坐标。在绘画时,使用随机颜色值。按下鼠标左键并拖动鼠标时,画线,释放鼠标左键结束画线,右击鼠标时画圆。图2-26给出了运行模式图。
【参考代码】


2.3.2 键盘的事件过程
键盘是非常重要的输入设备,用户将信息通过键盘传递给应用程序,对键盘事件的编程尤为重要。与键盘相关的事件主要有KeyDown、KeyUp、KeyPress等,事件在被触发时,会传递参数给事件过程。
在Visual Basic中,重要的键盘事件有KeyPress、KeyDown、KeyUp。
·KeyPress事件:用户按下并释放一个会产生ASCII码的按键时被触发。
·KeyDown事件:用户按下键盘上任意一个键时被触发。
·KeyUp事件:用户释放键盘上任意一个键时被触发。
1.KeyPress事件
KeyPress事件只对产生ASCII码的按键反应,包括数字键、大小写英文字母键、【Enter】键、【Backspace】键、【Esc】键、【Tab】键等,而对于方向键,因为其是不会产生ASCII码的按键,所以不会触发该事件。
(1)事件过程形式

(2)说明
参数KeyAscii为所按键对应的ASCII码值。KeyPress事件过程接收到的是用户按键的ASCII码字符。例如,当用户输入小写的“a”时,KeyAscii参数值为97;当用户输入大写的“A”时,KeyAscii参数值为65。
2.KeyUp事件和KeyDown事件
当焦点在某个对象上,同时用户按下键盘上的任意键时,引发对象的KeyDown事件;释放按键,引发KeyUp事件。
(1)事件过程形式


(2)说明
·KeyCode参数值是用户所操作键的扫描码,传递给事件过程的是用户所操作的物理键。
例如,不管输入的是大写还是小写“a”,KeyCode参数值都相同。
·Shift参数与鼠标事件中的Shift参数意义相同。
默认情况下,当用户对当前具有控制焦点的控件进行键盘操作时,控件的KeyPress、KeyDown、KeyUp事件被触发,但是窗体的KeyPress、KeyDown、KeyUp事件不会被触发。为了启用窗体的这3个事件,必须将窗体的KeyPreview属性设置为True,而默认值为False。
【例2-12】编写一个程序,当按下【Alt+F3】组合键时,终止工程文件的运行。
【问题分析】在设计模式下,首先将窗体的KeyPreview属性的值设置为True。按下【Alt】键时Shift的值为4,【F3】键的KeyCode码为vbKeyF3。
【参考代码】
