在VB應用軟件中實現動畫效果
發表于:2007-07-14來源:作者:點擊數:
標簽:
余鑫銘 在 開發 VB 應用程序中,加入了動畫之后可使軟件具有生動活潑的效果,而且,在編寫組態軟件中,動畫功能更是必不可少,如容器中容量的變化、液體液面的變化等,實際也是一種動畫效果。在中科院空間中心開發的“電場和電導率監測網中心站專家系統”中
余鑫銘
在
開發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
原文轉自:http://www.anti-gravitydesign.com