- 零基础学Visual Basic第2版
- 李俊民 赵东等编著
- 933字
- 2024-12-20 23:53:31
4.11 计时器
Visual Basic为用户提供了一个名叫计时器(Timer)的控件,该控件在运行阶段是不可见的,因此可以将其放到窗体的任何地方。计时器的属性和事件很少,最重要的属性有Interval和Enabled,最重要的事件也是唯一的事件有Timer。计时器控件在Enabled属性为True的前提下,每隔Interval/1000秒就会自动触发Timer事件。
4.11.1 Interval 属性
Interval(时间间隔)属性以千分之一秒为单位,该属性用来控制计时器事件触发的时间间隔。例如,如果将该属性设置为1000,Visual Basic就会每隔1秒钟触发一次Timer事件,如果想让Timer事件每隔3秒钟就触发一次,那应该设置Interval为3000。当然前面已经提到过是在Enabled属性为True的前提下上面的描述才有效。
4.11.2 Timer 事件
Timer事件是计时器控件的唯一事件。当Enabled属性为True的前提下,它在每隔Inerval/1000秒就会自动发生,根据此特性编程人员经常使用计时器控件计时或实现动画效果。
【实例4.15】编程实现时间走动的电子表的效果,窗体中有一个文本框和一个计时器,如图4.29所示。
图4.29 实例4.15设计界面
各控件的属性设置如表4.17所示,其中将计时器的Interval属性设置为1000的目的是让Timer事件每隔一秒钟自动发生一次。
表4.17 实例4.15中控件的属性设置
编写事件过程如下。
01 Private Sub tmrTime_Timer() 02 txtShowTime.Text = Time() 03 End Sub
说明
程序中的Time()是一个系统函数,用来提取系统当前时间。需要注意的是Time()函数提取的当前时间是一个点,而不是连续的时间。
【代码说明】程序运行后等待Interval属性设置的时间间隔为1秒钟,当过了1秒钟之后自动触发计时器tmrTime的Timer事件,代码第02行在此事件中,将当前系统时间显示到了文本框中,接下来再次等待1秒钟后再次触发Timer事件并执行其内的表达式提取当前系统时间(注意这时系统时间已经向后走了一秒)然后显示到文本框里(替换了以前的内容),就这样一直反复,直到结束程序为止。
【运行效果】运行结果如图4.30所示。
图4.30 实例4.15运行结果
说明
计算机动画和普通动画其实是一个原理,都是将一个一个场景快速地播放来引起人们视觉上的动感错觉。
4.11.3 应用案例—实现弹球动画
上一节的应用案例“移动小蜜蜂”实现了通过单击按钮来移动图形的效果,这一节将带领读者使用图片框、图像框和计时器完成图形自动移动的功能。
【实例4.16】编程实现弹球动画,最终效果为图中的圆球以直线自动移动,当遇到边界时向相反的方向移动,类似于打砖块游戏中的弹球,界面设计如图4.31所示,图中白色区域为图片框,虚框是一个图像框。
窗体中,各控件的属性设置如表4.18所示。
图4.31 实例4.16的程序界面
表4.18 实例4.16中控件的属性设置
编写事件过程如下。
01 Option Explicit 02 Dim x As Integer 03 Dim y As Integer 04 05 Private Sub Form_Load() 06 imgBall.Picture = LoadPicture(App.Path & "\pic\ball.gif") 07 x = 100 08 y = 100 09 End Sub 10 11 Private Sub tmrMoveBall_Timer() 12 If imgBall.Top >= pic1.Height - imgBall.Height Then '判断圆球的下边界是否移到了图片框下边界处 13 y = -100 14 End If 15 16 If imgBall.Left >= pic1.Width - imgBall.Width Then '判断圆球的右边界是否移到了图片框右边界处 17 x = -100 18 End If 19 20 If imgBall.Top <= 0 Then '判断圆球的上边界是否移到了图片框上边界处 21 y = 100 22 End If 23 24 If imgBall.Left <= 0 Then '判断圆球的左边界是否移到了图片框左边界处 25 x = 100 26 End If 27 28 imgBall.Left = imgBall.Left + x 29 imgBall.Top = imgBall.Top + y 30 End Sub
程序中的x,y两个变量是窗体级变量,其作用范围是整个窗体代码模块。关于程序中用到的判断边界的方法可以参考图4.32。
图4.32 判断边界的参考图
【代码说明】首先自动触发第05~09行的窗体加载事件,图像框中载入了图形文件“ball.gif”,并初始化x,y两个变量为100。等待0.1秒钟(因为Interval为100)后,计时器中第11~30行的Timer事件被自动触发,随之执行其内的语句。首先执行第一个If语句,因为这时图像框在初始位置(参考图4.30),其属性imgBall.Top的值不大于pic1.Height - imgBall.Height的值,所以该If语句因为条件为False而不执行。后面的3个If语句因为类似的原因也不被执行直接跳过,然后执行了最后两条语句,将图像框mgBall向右、下方向分别移动了100,改变了图像框的位置。
直到圆球碰到下边界以前,程序都按以上分析的情况执行,一旦碰到下边界图像框的属性imgBall.Top的值就会不小于pic1.Height - imgBall.Height的值,从而执行第一个If语句,将变量y的值改变为-100,其他3个If语句此时因为条件还是为False所以还是不执行,执行到最后两条语句时图像框imgBall因为y的值变为了-100所以会向上移动,而x的值因为还是100所以继续向右移动,因此得到了向右上移动的效果。读者可以用此思路继续分析程序的运行效果。
【运行效果】程序运行结果请参考图4.33。
图4.33 实例4.16程序运行结果
说明
图中黑线为圆球前5步的大致移动路径