利用API函式實現影像淡入淡出效果 (轉)

gugu99發表於2007-12-23
利用API函式實現影像淡入淡出效果 (轉)[@more@]利用實現影像淡入淡出效果 一般傳統的實現兩個PictureBox之間影像的淡入淡出效果都需要使用大量的API函式並進行復雜的調色盤以及 繪圖裝置(Device Context)的操作。但是在、中,提供了支援透明影像複製的AlphaBlend函式。 這篇文章就介紹如何透過API函式AlphaBlend實現PictureBox之間影像的淡入淡出效果。AlphaBlend函式的定義在 msimg32.dll中,一般Win98、Win2000都帶了這個庫,在之前你可以先察看一下該是否存在。 開啟VB建立一個新工程。選擇選單 Project | Add Module 新增一個模組到工程中,在其中輸入以下程式碼: Public Type rBlendProps tBlendOp As Byte tBlendOptions As Byte tBlendAmount As Byte tAlphaType As Byte End Type Public Declare Function AlphaBlend Lib "msimg32" (ByVal hDestDC As Long, _ ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _ ByVal nHeight As Long, ByVal hSrcDC As Long, _ ByVal xSrc As Long, ByVal ySrc As Long, ByVal widthSrc As Long, _ ByVal heightSrc As Long, ByVal blendFunct As Long) As Boolean Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _ (Destination As Any, As Any, ByVal Length As Long) 大家可以看到,AlphaBlend函式的定義同普通的複製函式Bitblt很相似,只是最後的引數blendFunct定義為一個 rBlendProps結構。那麼為什麼在函式定義中blendFunct 定義為Long型別呢?因為rBlendProps結構長度是4個位元組。 而Long型別變數的長度也是4個位元組,那麼我們就可以中透過API函式CopyMemory將一個rBlendProps結構複製到 blendFunct 中。 在Form1中新增兩個PictureBox,其中Picture2為源,Picture1為複製目標,將兩者的ScaleMode都設定為3-Pixel 將兩者的AutoRedraw屬性都設定為True,然後分別新增影像。在加入一個Timer控制元件以及一個Commanutton控制元件,然後 在Form1的程式碼視窗中新增如下程式碼: Dim lTime As Byte Sub ShowTransparency(cSrc As PictureBox, cDest As PictureBox, _ ByVal nLevel As Byte) Dim LrProps As rBlendProps Dim LnBlendPtr As Long cDest.Cls LrProps.tBlendAmount = nLevel CopyMemory LnBlendPtr, LrProps, 4 With cSrc AlphaBlend cDest.hDC, 0, 0, .ScaleWidth, .ScaleHeight, _ .hDC, 0, 0, .ScaleWidth, .ScaleHeight, LnBlendPtr End With cDest.Refresh End Sub Private Sub Command1_Click() lTime = 0 Timer1.Interval = 100 Timer1.Enabled = True End Sub Private Sub Timer1_Timer() lTime = lTime + 1 ShowTransparency Picture2, Picture1, lTime If lTime >= 255 Then Timer1.Enabled = False End If Me.Caption = Str(Int(lTime / 2.55)) + "%" End Sub 執行程式,點選Command1,就可以看到Picture2影像複製到Picture1上的淡入淡出效果了。 在結構rBlendProps中,最重要的引數就是tBlendAmount,該值決定了源與目標之間的透明程式。如果為0的話,源完全 透明,如果為255的話,源完全覆蓋目標。 另外AlphaBlend 函式不只用於兩個PictureBox之間的複製,而且可以在兩個Device Context之間的透明複製,也就是 說,象視窗等控制元件之間也可以實現透明效果。不過在程式設計過程中發現一個問題,不知是否是AlphaBlend的,就是在我寫完 程式後,並沒有出現透明覆制的效果。搞的我以為該函式不起作用,但是當我再開啟VB執行上面的程式後,一切有正常了。 我在MSDN上也沒有找到相關的Bug列表。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-995466/,如需轉載,請註明出處,否則將追究法律責任。

相關文章