在开发VB应用程序中,加入了动画之后可使软件具有生动活泼的效果,而且,在编写组态软件中,动画功能更是必不可少,如容器中容量的变化、液体液面的变化等,实际也是一种动画效果。在中科院空间中心开发的“电场和电导率监测网中心站专家系统”中,有多处使用动画效果,现简明介绍如下。
一、使用Animation控件
在VB5.0中可以使用Animation控件实现动画,实例如下:
Private Sub Animation1_Click ()
With CommonDialog1
Filter = "avi (*.avi)|*.avi"
'过滤器指定在对话框的文件列表框中显示文件的类型
.ShowOpen
显示“打开”对话框
End With
With Animation1
.Autoplay = True
'一旦将 .avi 文件加载到 Animation 控件中,则 .avi 文件 将连续循环的自动播放。
.Open CommonDialog1.Filename
'打开一个将要播放的 .avi 文件。如果 AutoPlay 属性为 True,则只要加载该文件便可。
End With
End Sub
Animation 控件不能播放含有声音数据的 .avi 文件。此外,动画控件只能显示未压缩的或用行程编码 (RLE) 压缩的 .avi 文件。当用文件调用 Open 方法时,如果该文件含有声音数据,或不具备特定的压缩格式,则返回错误。
二、使用AniPushButton(AniButton)控件
受WINDOWS/NT超级终端动画效果的影响,笔者也希望在开发的应用软件中加入转动地球的效果。首先用PHOTOSHOP制作一些图画,地球的图像是用一个地球仪临摹取得的,每次将地球仪转动一个固定的角度,得到一幅不同角度地球的图像,重复多次,且将每一幅图存为一个.bmp文件,供AniPushButton调用。
AniPushButton控件包含了大量的属性、方法、事件供开发人员使用。首先在Picture和Frame属性中装入图像文件,Picture属性可以装入多幅图像文件,帧Frame属性是Picture属性装入图像文件的索引,Frame属性是1对应第一个图像文件,注意,Frame 只能从1开始,而图像数组可以从0开始,这两个属性可以在属性设计时设置,也可以在程序中设置,Picture属性可以装入.bmp、.ico、.wmf等文件,其他格式的图像文件可以用PHOTOSHOP或SEA等文件进行格式转换,在动画的图像文件装入时,不是装入一幅图像文件,而是要在Frame属性的控制下,装入多幅图像文件,Frame为1,Picture装入第一幅图像文件,Frame为2,Picture装入第二幅图像文件,依次类推,将可产生动画效果的各种图像依次装入Picture属性中。
PicDrawMode属性用于设置显示图像与装入图像之间的比例关系。0为控制按设计的大小装入图像,1为控制按图像的大小自动调整边框的大小,2为图像按控制的大小放大或缩小原图 Caption属性,为了不影响动画的效果,这里清空Caption属性。
Speed属性,表示动态切换每幅图的速度,以毫秒ms为单位,值越大,切换速度越慢。
SpecialOp属性,该属性在设计时无效,只有在程序运行时软件设置,为1时,表示模拟鼠标的Click操作,不由用户操作触发,而由系统自动触发动画按钮,使控制执行Click功能,在下面的软件中使用定时器来激活该功能。在下面的程序中,用到的一些参数值,包括Picture和Frame都是在程序中设置的,不是在属性对话框中设置的。
Private Sub Form_Load()
With timer1 设定时器属性
.Enabled = False
.Interval = 600
End With
With AniPushButton1 '设AniPushButton1各属性
.Enabled = True 激活
.Cycle = 0
.Caption = ""
.PictDrawMode = 1 按图像的大小自动调整
.Speed = 200 帧切换速度
.Frame = 1 用LoadPicture方法给Picture属性赋值
.Picture = LoadPicture("c:\earth1.bmp ")
.Frame = 2
.Picture = LoadPicture("c:\earth2.bmp")
.Frame = 3
.Picture = LoadPicture("c:\earth3.bmp")
.Frame = 4
.Picture = LoadPicture("c:\earth4.bmp")
.Frame = 5
.Picture = LoadPicture("c:\earth5.bmp")
End With
End Sub
Sub Cmd_Start_Click () 开始命令按钮启动定时器
timer1.Enabled = -1
End Sub
Sub Timer1_Timer ()
AniButton1.SpecialOp = 1 实现鼠标的Click操作
End Sub
三、使用PictureClip控件实现动画
该控件提供了存储多个图像信息的技术,其访问方式不是向AniPushButton依次切换每幅图像,而是先将多幅图像依次有序存放在一个.bmp文件中,.bmp中的图像将被均匀分割成许多小块,每一块作为动画切换的一幅图。
下面的程序将实现一个转动陀螺的动画效果。
在程序的声明段定义变量:
Dim y As Integer
Dim toggle As Integer
Private Sub Form_Load()
picture1.Picture = PictureClip1.
GraphicCell(0) 使用第一幅为开始帧
y = 0
toggle=0
End Sub
Private Sub cmd_onoff_Click() 开关命令按钮
If toggle = 0 Then
cmd_onoff.Caption = "停止"
toggle = 1
Else
cmd_onoff.Caption = "旋转"
toggle = 0
End If
End Sub
Private Sub Timer1_Timer()
If toggle = 1 Then spin 满足条件,调图切换子程序
End Sub
Private Sub spin()
y = y + 1: If y = 17 Then y = 0
picture1.Picture = PictureClip1.
GraphicCell(y) 图切换一帧
End Sub
在上面的程序中,使用了命令按钮、图片控件、定时器和图像剪切控件等功能,其中最主要的是制作图像文件。图像文件制作分两个过程,首先制作单个的图像文件,然后,将这些图像文件合并成一个图像文件,存于一个.bmp文件中,在图像合成时可使用WINDOWS/95中的“画图”,用粘贴的方法完成。注意,在图像合成时,应设置状态栏参数以确定图像的精确位置,否则,在动画过程中,图像会出现跳动和不稳定感。
四、使用Image实现动画效果
该功能用定时器控件来控制移动和地球转动的速度,当然,其速度还与程序中设定的步长有关系,具体程序片段如下:
Private Sub Form_Load()
Timer_animate.inteval=100 INTEVAL属性为100ms
Timer_animate.enabled=true 启动动画定时器
End Sub
Private Sub Timer_animate_Timer()
Call ani_Image 定时调移动子程序
End Sub
Sub IncrFrame()
FrameNum = FrameNum + 1 帧加1
If FrameNum > 5 Then
最后一帧图像显示之后返回第一帧
FrameNum = 1
End If
Imageearth(0).Picture = Imageearth(FrameNum).Picture
将该帧图像赋给运动的Imageearth(0)控件的Picture属性
End Sub
Sub ani_Image() 控制移动子程序
Select Case Motion 控制移动方向的变量
Case 1 向上和向左移动,步长50 twips
Imageearth(0).Move Imageearth(0).
Left - 50, Imageearth(0).Top - 50
IncrFrame 切换到下一幅图
If Imageearth(0).Left < = 0 Then 向左移动到了边界
Motion = 2 向上和向右移动
ElseIf Imageearth(0).Top < = 0 Then
Motion = 4 向上移动到了边界,改向下和向左移动
End If
Case 2 向右和向上
Imageearth(0).Move Imageearth(0).Left + 50,
Imageearth(0).Top - 50
IncrFrame
到了右边界,转为向左和向上
If Imageearth(0).Left >= (startform.Width
- Imageearth(0).Width) Then
Motion = 1
ElseIf Imageearth(0).Top < = 0 Then
Motion = 3 向右向下
End If
Case 3 向右向下
Imageearth(0).Move Imageearth(0).Left + 50,
Imageearth(0).Top + 50
IncrFrame
If Imageearth(0).Left >= (startform.Width
- Imageearth(0).Width) Then
Motion = 4 向左向下
ElseIf Imageearth(0).Top >=
(startform.Height - Imageearth(0).Height) - 680 Then
Motion = 2 向右向上,其中680 twips是标题和菜单的高度
End If
Case 4 向左向下
Imageearth(0).Move Imageearth(0).Left - 50,
Imageearth(0).Top + 50
IncrFrame
If Imageearth(0).Left < = 0 Then
是否到了左边界,如到了转向右向下
Motion = 3
是否到了下边界
ElseIf Imageearth(0).Top >= (startform.Height
- Imageearth(0).Height) - 680 Then
Motion = 1 向左向上
End If
End Select
End Sub
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/