圖形的切換在有關(guān)于多媒體的應(yīng)用中是經(jīng)常見到的。常見的切換方式可以概括為以下幾種。
切換(Cut):當(dāng)前圖象快速的被另一幅圖象所取代
淡入(Fade In):當(dāng)前圖象緩緩變黑至消失
淡出(Fade Out):一幅圖象緩緩的從黑色的屏幕中出現(xiàn)
隱現(xiàn)(Dissolve):一幅圖象緩緩的變?yōu)榱硪环鶊D象
滑入(Wipe):一幅圖象逐漸穿過并覆蓋當(dāng)前圖象
拉進(jìn)(Slide):一幅圖象從屏幕一邊勻速滑入
彈進(jìn)彈出(Pop on/off):一幅圖象立即出現(xiàn)或消失
上拉下拉(Pull Down/Up):一幅圖象象窗簾一樣從屏幕項(xiàng)部拉下,并以相同方式返回
翻轉(zhuǎn)(Flip):當(dāng)前圖象翻轉(zhuǎn),在其反面顯示另一圖象
旋轉(zhuǎn)(Spin):圖象以旋轉(zhuǎn)方式出現(xiàn)
VB和Windows API為生成切換效果提供了有力的工具。圖形切換的實(shí)質(zhì)是通過快速組合或拷貝來建立分離的圖象。在某些情況下,建立切換效果只不過將當(dāng)前圖象的屬性由Visible轉(zhuǎn)變True,如上述效果中的彈進(jìn)彈出、切換等,而多數(shù)情況下,切換效果需要調(diào)用Windows的GDI函數(shù)來完成。
圖形的切換和彈進(jìn)彈出是最容易實(shí)現(xiàn)的例子,前面已經(jīng)解釋過這兩種切換效果的含義了。在Form中拉出Image1和Image2,注意,Image1和Image2的坐標(biāo)和大小應(yīng)完全一樣。并設(shè)置好事先準(zhǔn)備好的兩幅圖形。將Image1的Visible設(shè)為True,再將Image2的Visible設(shè)為false,雙擊Form,輸入如下程序代碼:
Private Sub Form_Click()
Image1.Visible=False
Image2.Visible=True
End Sub
在程序運(yùn)行時(shí),應(yīng)只能看到Image1。這時(shí),點(diǎn)擊鼠標(biāo),即可看Image1快速的被Image2所代替。形成圖形的切換效果。這時(shí)再將Image1和Image2的坐標(biāo)錯(cuò)開,不要讓兩個(gè)圖形有重疊部分。這時(shí)再運(yùn)行程序,點(diǎn)擊鼠標(biāo),Image1消失的同時(shí), Image2在另一個(gè)地方出現(xiàn)。形成圖形的彈進(jìn)彈出效果。
拉進(jìn)和滑入是稍微復(fù)雜點(diǎn)的切換方式。在Form1中加入Timer組件,設(shè)interval為1,再在Form1中加入PictureBox1,假設(shè)PictureBox1的Left為-3000,Width為3000;Form1的Width為9000,雙擊Timer組件,加入下列程序代碼:
Private Sub Timer1_Timer()
If Picture1.Left > 6000 Then
Picture1.Left = 6000
Else
Picture1.Move Picture1.Left + 100
End If
End Sub
運(yùn)行程序時(shí),由于Pictrue1在邊界外,所以看不見,隨著Picture.Left+100,Pictrue1由邊界外緩緩滑入Form中,當(dāng)Picture1距左邊界大約6000時(shí),也就大致在Form1中間位置時(shí),Picture1停止運(yùn)動。形成了圖形從屏幕邊或一角平穩(wěn)滑入的拉入效果。而如果在Picture1靜止后的位置上事先設(shè)置好和Picture1一樣大小的Picture2,這樣又形成下一圖形逐漸穿過并覆蓋當(dāng)前圖形的滑入效果。
上述算法都很簡單,也能滿足一般的編程需求,不過在進(jìn)行一些高要求的編程時(shí),這些效果則略顯粗糙了,但調(diào)用Windows本身的GDI函數(shù)則可滿足一些近似苛求的效果。下面我們通過調(diào)用GDI函數(shù)重寫上面的滑入效果。
在Form1中設(shè)兩個(gè)盡可能大小相同的picCurrentPicture和picNextPictrue,并設(shè)picCurrentPicture的Visible為True,picNextPicture的Visible設(shè)為False;Autosize設(shè)為True,ScaleMode設(shè)為Pixel,再在Form1中加入一個(gè)Command和一個(gè)Timer。程序編寫過程如下:
先對公共部分進(jìn)行說明,可以直接從VB中的Text API View中將有關(guān)BitBlt的聲明復(fù)制過來,具體內(nèi)容如下:
Declare Function BitBlt Lib "GDI" (ByVal hDestDC As _
Integer, ByVal X As Integer, ByVal Y As Integer, _
ByVal nWidth As Integer, ByVal nHeight As Integer, _
ByVal hSrcDC As Integer, ByVal XSrc As Integer, _
ByVal YSrc As Integer, ByVal dwRop As Long) As Integer
Const lngSRCCORY=&HCC0020
Const intSTEPS=64
Dim intCurrentPictrueWidth As Integer, _
intWidthChange As Integer, intPieceToAdd As Integer, intNextPiece As Integer
雙擊Timer組件,輸入下列代碼:
Private Sub Timer1_Timer()
Dim intI As Integer
IntNextPiece=BitBlt(picCurrentPicture.hDC,0,0, _
intPieceToAdd,PicCurrentPicture.ScaleHeight, _
picNextPicture.hDC,0,0,lngSRCCOPY)
IntPieceToAdd=intPieceToAdd+intWidthChang
IntI=intI+1
If(intI-intSteps) >0 Then Timer1.Enabled=False
End Sub
雙擊Command1,輸入如下代碼:
Private Sub Command1_Click()
intCurrentPictureWidth=picCurrentPicture.ScaleWidth
intPieceToAdd=intWidthChange
Timer1.Enabled=True
End Sub
這時(shí)再運(yùn)行程序,點(diǎn)擊Command1,怎么樣,這次滑入的效果是不是比用前一種方法要精細(xì)的多?
另外常用到的還有翻轉(zhuǎn)、旋轉(zhuǎn)以及淡入淡出。限于篇幅,這里只作簡要介紹。
在翻轉(zhuǎn)效果中,顯示每一圖形的反面并不重要,關(guān)鍵在于需要用到一塊空間來改變它。同時(shí)也必須考慮圖象大小不同的情況。另外,通過跟蹤某些關(guān)鍵事件并使用它們檢測圖象應(yīng)該變大還是變小,可以使程序更加簡練。
假設(shè)一矩形,中心畫出一條垂直線段,切換從矩形上最寬時(shí)開始,當(dāng)切換的前一半完成時(shí),矩形中心線兩邊的部分都縮小為窄長條,在這一過程中其寬度按一固定量(設(shè)為TempWidth)減小,在切換的后半過程中,矩形將會擴(kuò)展到新圖象的尺寸。
這種縮小和擴(kuò)大的完成方式將決定切換過程的光滑程度。在程序中,矩形的寬度減小某一增量(TempWidth),圖形將在新矩形中重畫(通過伸縮使之適合新的大小),再用Move 方法將圖形向左或向右移動增量大小的一半。通過調(diào)整Timer控件的速度和增量的大小,就能生成預(yù)期的效果。
至于淡入淡出,相對來說有些復(fù)雜,不過原理只是把所顯示的圖形的各個(gè)像素隨機(jī)變黑或是將隨機(jī)的將變黑的象素變回原色,也需要調(diào)用GDI函數(shù),詳細(xì)說明需用較大的篇幅,在這里就不再過多的敘述了。
切換(Cut):當(dāng)前圖象快速的被另一幅圖象所取代
淡入(Fade In):當(dāng)前圖象緩緩變黑至消失
淡出(Fade Out):一幅圖象緩緩的從黑色的屏幕中出現(xiàn)
隱現(xiàn)(Dissolve):一幅圖象緩緩的變?yōu)榱硪环鶊D象
滑入(Wipe):一幅圖象逐漸穿過并覆蓋當(dāng)前圖象
拉進(jìn)(Slide):一幅圖象從屏幕一邊勻速滑入
彈進(jìn)彈出(Pop on/off):一幅圖象立即出現(xiàn)或消失
上拉下拉(Pull Down/Up):一幅圖象象窗簾一樣從屏幕項(xiàng)部拉下,并以相同方式返回
翻轉(zhuǎn)(Flip):當(dāng)前圖象翻轉(zhuǎn),在其反面顯示另一圖象
旋轉(zhuǎn)(Spin):圖象以旋轉(zhuǎn)方式出現(xiàn)
VB和Windows API為生成切換效果提供了有力的工具。圖形切換的實(shí)質(zhì)是通過快速組合或拷貝來建立分離的圖象。在某些情況下,建立切換效果只不過將當(dāng)前圖象的屬性由Visible轉(zhuǎn)變True,如上述效果中的彈進(jìn)彈出、切換等,而多數(shù)情況下,切換效果需要調(diào)用Windows的GDI函數(shù)來完成。
圖形的切換和彈進(jìn)彈出是最容易實(shí)現(xiàn)的例子,前面已經(jīng)解釋過這兩種切換效果的含義了。在Form中拉出Image1和Image2,注意,Image1和Image2的坐標(biāo)和大小應(yīng)完全一樣。并設(shè)置好事先準(zhǔn)備好的兩幅圖形。將Image1的Visible設(shè)為True,再將Image2的Visible設(shè)為false,雙擊Form,輸入如下程序代碼:
Private Sub Form_Click()
Image1.Visible=False
Image2.Visible=True
End Sub
在程序運(yùn)行時(shí),應(yīng)只能看到Image1。這時(shí),點(diǎn)擊鼠標(biāo),即可看Image1快速的被Image2所代替。形成圖形的切換效果。這時(shí)再將Image1和Image2的坐標(biāo)錯(cuò)開,不要讓兩個(gè)圖形有重疊部分。這時(shí)再運(yùn)行程序,點(diǎn)擊鼠標(biāo),Image1消失的同時(shí), Image2在另一個(gè)地方出現(xiàn)。形成圖形的彈進(jìn)彈出效果。
拉進(jìn)和滑入是稍微復(fù)雜點(diǎn)的切換方式。在Form1中加入Timer組件,設(shè)interval為1,再在Form1中加入PictureBox1,假設(shè)PictureBox1的Left為-3000,Width為3000;Form1的Width為9000,雙擊Timer組件,加入下列程序代碼:
Private Sub Timer1_Timer()
If Picture1.Left > 6000 Then
Picture1.Left = 6000
Else
Picture1.Move Picture1.Left + 100
End If
End Sub
運(yùn)行程序時(shí),由于Pictrue1在邊界外,所以看不見,隨著Picture.Left+100,Pictrue1由邊界外緩緩滑入Form中,當(dāng)Picture1距左邊界大約6000時(shí),也就大致在Form1中間位置時(shí),Picture1停止運(yùn)動。形成了圖形從屏幕邊或一角平穩(wěn)滑入的拉入效果。而如果在Picture1靜止后的位置上事先設(shè)置好和Picture1一樣大小的Picture2,這樣又形成下一圖形逐漸穿過并覆蓋當(dāng)前圖形的滑入效果。
上述算法都很簡單,也能滿足一般的編程需求,不過在進(jìn)行一些高要求的編程時(shí),這些效果則略顯粗糙了,但調(diào)用Windows本身的GDI函數(shù)則可滿足一些近似苛求的效果。下面我們通過調(diào)用GDI函數(shù)重寫上面的滑入效果。
在Form1中設(shè)兩個(gè)盡可能大小相同的picCurrentPicture和picNextPictrue,并設(shè)picCurrentPicture的Visible為True,picNextPicture的Visible設(shè)為False;Autosize設(shè)為True,ScaleMode設(shè)為Pixel,再在Form1中加入一個(gè)Command和一個(gè)Timer。程序編寫過程如下:
先對公共部分進(jìn)行說明,可以直接從VB中的Text API View中將有關(guān)BitBlt的聲明復(fù)制過來,具體內(nèi)容如下:
Declare Function BitBlt Lib "GDI" (ByVal hDestDC As _
Integer, ByVal X As Integer, ByVal Y As Integer, _
ByVal nWidth As Integer, ByVal nHeight As Integer, _
ByVal hSrcDC As Integer, ByVal XSrc As Integer, _
ByVal YSrc As Integer, ByVal dwRop As Long) As Integer
Const lngSRCCORY=&HCC0020
Const intSTEPS=64
Dim intCurrentPictrueWidth As Integer, _
intWidthChange As Integer, intPieceToAdd As Integer, intNextPiece As Integer
雙擊Timer組件,輸入下列代碼:
Private Sub Timer1_Timer()
Dim intI As Integer
IntNextPiece=BitBlt(picCurrentPicture.hDC,0,0, _
intPieceToAdd,PicCurrentPicture.ScaleHeight, _
picNextPicture.hDC,0,0,lngSRCCOPY)
IntPieceToAdd=intPieceToAdd+intWidthChang
IntI=intI+1
If(intI-intSteps) >0 Then Timer1.Enabled=False
End Sub
雙擊Command1,輸入如下代碼:
Private Sub Command1_Click()
intCurrentPictureWidth=picCurrentPicture.ScaleWidth
intPieceToAdd=intWidthChange
Timer1.Enabled=True
End Sub
這時(shí)再運(yùn)行程序,點(diǎn)擊Command1,怎么樣,這次滑入的效果是不是比用前一種方法要精細(xì)的多?
另外常用到的還有翻轉(zhuǎn)、旋轉(zhuǎn)以及淡入淡出。限于篇幅,這里只作簡要介紹。
在翻轉(zhuǎn)效果中,顯示每一圖形的反面并不重要,關(guān)鍵在于需要用到一塊空間來改變它。同時(shí)也必須考慮圖象大小不同的情況。另外,通過跟蹤某些關(guān)鍵事件并使用它們檢測圖象應(yīng)該變大還是變小,可以使程序更加簡練。
假設(shè)一矩形,中心畫出一條垂直線段,切換從矩形上最寬時(shí)開始,當(dāng)切換的前一半完成時(shí),矩形中心線兩邊的部分都縮小為窄長條,在這一過程中其寬度按一固定量(設(shè)為TempWidth)減小,在切換的后半過程中,矩形將會擴(kuò)展到新圖象的尺寸。
這種縮小和擴(kuò)大的完成方式將決定切換過程的光滑程度。在程序中,矩形的寬度減小某一增量(TempWidth),圖形將在新矩形中重畫(通過伸縮使之適合新的大小),再用Move 方法將圖形向左或向右移動增量大小的一半。通過調(diào)整Timer控件的速度和增量的大小,就能生成預(yù)期的效果。
至于淡入淡出,相對來說有些復(fù)雜,不過原理只是把所顯示的圖形的各個(gè)像素隨機(jī)變黑或是將隨機(jī)的將變黑的象素變回原色,也需要調(diào)用GDI函數(shù),詳細(xì)說明需用較大的篇幅,在這里就不再過多的敘述了。