電影或電視中常可見一些字幕或圖片的動態變化特技,在製作多媒體教學軟體或廣告宣傳等多媒體簡報文件時,也常常需要用到一些圖文的動態變化效果。 VB6.0作為Windows軟體的強大開發工具,在多媒體程式設計方面具有廣闊的應用前景。本文討論運用VB6.0的定時器並結合WindowsAPI函數實現圖片或文字的動態縮放和漸隱漸現等特技效果。
一、實現圖文動態縮放和漸隱漸現特效的程序方法
1、程式介面
取窗體名為Form1,其Windowstate屬性設為2。在窗體Form1中設定如下控制項與屬性:一個標籤控制項Label1,其backcolor等於form1的backcolor;bondstyle為0,Autosize為True。一個影像控制項image1,其Stratch和Visible均為True;Bordstyle為0。兩個圖片框控制Picture1和Picture2,Visible屬性Picture1為False而Picture2為True;AutoRedraw屬性Picture1為True而Picture為False;ScaleModel屬性兩者皆為Pixels;Bondstyle屬性兩者皆為0。三個定時器控制項Timer1,Timer2和Tirner3;指令按鈕控制陣列cmd(0),......,Cmd(4),其caption屬性分別為:「文字縮放」、「圖片縮放」、「文字隱現」、「圖片隱現」和「退出」。
2、文字的動態縮放
透過VB6.0的定時器控制項定時改變文字的Size屬性,就可達到文字被動態放大或縮小的效果。程式中透過timer1的tuner過程來控制標籤Label1的caption屬性文字大小。由cmd(0)觸發的cmd_click事件引發timer1_time過程,透過一邏輯變數1(0)(數組元素)控製文字的變化方式,1(0)=true時使字體動態放大,1(0)=false時使字體動態縮小。
3.圖形的動態縮放
將影像控制項image1的stretch屬性設為true,可實現控制項中圖片大小隨imagel控制項大小的變化而變化。透過定時器timer2的tuner流程定時改變imagel控制項的尺寸大小,就達到了讓圖片動態縮放的效果。由cmd(1)觸發的cmd_click事件將引發timer2_time過程,透過邏輯變數1(1)控制圖片變化的方式,1(1)=true時控制圖片動態放大,1(1)=false時控制圖片動態縮小。
4.文字的漸隱漸現效果
從字串中取若干個文字作為標籤Label1的caption值,如果從字符串中截取的文字數遞增(直到等於字符串的全部字數),則實現文字漸現效果;而截取的文字如果遞減(從字串的全部字數減到0),則達到文字漸隱效果。透過定時器timer3的time:過程定時改變截取的字數,來達到此效果。由cmd(2)觸發的。 md_click事件引發timer3_time過程,透過邏輯變數1(2)控製文字變化的方式,1(2)=true時使文字漸現,1(2)=false時使文字漸隱。
5.圖形的漸隱漸現效果
用WindowsAPI函數BitBlt複製圖片的方法實作。 BitBlt函數的使用方法為:
->BitBlthDestDC,x,y,nWidth,nHeight,hSrcDC,xSrc,ySrc,dwRop->
其中各參數的意義為:hDestDC和hSrcDC分別表示目標設備描述表句柄和來源設備描述表句柄。即要把圖片從hSrcDC複製到hDestDC。 Picturellox控制項的hDC屬性就是我們要用到的裝置來描述表格句柄。 x,Y表示目標中左上角的位置,nWidth,nHeight表示目標中的寬和高。即要把圖片複製到目標裝置描述表中的什麼位置,以及複製多寬多高。 xsrc和ySrc表示來源圖片中的左上角位置,即表示從什麼位置開始複製。 DwRop參數表示一種繪製方式,常用直接複製方式,這時就取SRCCOPY。
二、實作圖文動態縮放和漸隱漸現特效的程式碼
->'對全域變數和API函數的通用宣告(API函式Sleep,BitBlt及其常參數SRCCOPY的宣告從略,可從API瀏覽器複製、貼上): Dim1(4)AsBoolean,iasLong,sAsString,ztAsInteger
'實現圖片漸現漸隱的通用過程:
PRivateSubPicCpy(OptionalstripAsInteger=10,OptionaldelayAsInteger=20)
DimplwAsInteger,plhAsInteger,p2AsInteger
If1(3)=TrueThen
Picture1=LoadPicture("c:/win98/安裝程式.bmp")
Else
Picture1=LoadPicture("")
EndIf
plw=Picturel.Width
plh=Picturel.Height
p2=0
DoWhilep2<=plw
BitBltPicture2.hDC,p2,0,strip,plh,Picture1.hDC,p2,0,SRCCOPY
p2=p2 strip
Sleepdelay
DoEvents
Loop'由於圖片寬度不一定是strip的整數倍,故下面再全圖複製一遍圖片:
BitBltPicture2.hDC,0,0,plw,plh,Picture1.hDC,0,0,SRCCOPY
EndSub
PrivateSubForm_load()
Label1.Font.Name="黑體"
Image1.Top=0
Image1.Left=0
Picture2.Top=0
Picture2.Left=Screen.Width-Picthne2.Width
s="產生縮放和隱現效果的文字"
zt=5'zt為字體大小控制變量
i=0'i為顯示文字時截取文字的字數變數
EndSub
PrivateSubCmd_Click(IndexAsInteger)
If1(Index)=TrueThen
1(Index)=False
Else
1(Idex)=True
EndIf
SelectCaseIndex
Case0'活化timer1的timer過程
Timer1.Enabled=True
Timer1.Interval=50
……'Case1,2與上述類似,分別活化timer2,timer3的timer過程
Case3'呼叫圖片複製過程Piccpy
PiCpy10,50
Case4'結束程式運行
UnloadMe
End
EndSelect
EndSub
PrivateSubTimer1_Timer()'實作文字縮放的過程
If1(0)=TrunThen
zt=zt< 5
Else
Zt=Zt-5
ElseIf
Ifzt>50orzt<=5Then
Timer1.Enabled=False
EndIf
WithLabel1
.Font.Size=zt
.Left=(Form1.Width-Lable1.Width)/2
.Top=(Form1.Height-Label1.Height)/2
EndWith
Label1.Caption=s
EndSub
PrivateSubTimer2_Timer()'實作圖片縮放的過程
If1(1)=TrueThen'使圖片放大
Image1.Width=Image1.Width Form1.Width/10
Image1.Height=Image1.Height Form1.Height/10
Else'讓圖片縮小
Image1.Width=Image1.Width-Form1.Width/10
Image1.Height=Image1.Height-Form1.Height/10
EndIf
If(Image1.Width>=Form1.Width/2)or(Image1.Width<=Form1.Width/10)Then
Timer2.Enabled=False
EndIf
Image1=LoadPicture("c:/win98/安裝程式.bmp")
EndSub
PrivateSubTimer3.Timer()
Label1.Font.Size=30
If1(2)=TrueThen
i=il
Else
i=i一1
EndIf
Ifi>=Len(s)oni<1Then
Timer3.Enabled=False
EndIf
Ifi>=0Then
Label1.Caption=Left$(s,i)
EndIf
EndSub->
以上程序在VB6.0和Windows98/2000環境下調試通過。
->