使用API函數(shù)完成圖像淡入淡出
發(fā)表時(shí)間:2024-05-17 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]一般傳統(tǒng)的實(shí)現(xiàn)兩個(gè)PictureBox之間圖像的淡入淡出效果都需要使用大量的API函數(shù)并進(jìn)行復(fù)雜的調(diào)色板以及繪圖設(shè)備(Device Context)的操作。但是在Win98、Win2000中,微軟提供了支持透明圖像拷貝的AlphaBlend函數(shù)。 這篇文章就介紹如何通過API函數(shù)AlphaBl...
一般傳統(tǒng)的實(shí)現(xiàn)兩個(gè)PictureBox之間圖像的淡入淡出效果都需要使用大量的API函數(shù)并進(jìn)行復(fù)雜的調(diào)色板以及繪圖設(shè)備(Device Context)的操作。但是在Win98、Win2000中,微軟提供了支持透明圖像拷貝的AlphaBlend函數(shù)。
這篇文章就介紹如何通過API函數(shù)AlphaBlend實(shí)現(xiàn)PictureBox之間圖像的淡入淡出效果。AlphaBlend函數(shù)的定義在msimg32.dll中,一般Win98、Win2000都帶了這個(gè)庫(kù),在編程之前你可以先察看一下該文件是否存在。
打開VB建立一個(gè)新工程。選擇菜單 Project Add Module 添加一個(gè)模塊到工程中,在其中輸入以下代碼:
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, Source As Any, ByVal Length As Long)
大家可以看到,AlphaBlend函數(shù)的定義同普通的復(fù)制函數(shù)Bitblt很相似,只是最后的參數(shù)blendFunct定義為一個(gè)rBlendProps結(jié)構(gòu)。那么為什么在函數(shù)定義中blendFunct 定義為L(zhǎng)ong類型呢?因?yàn)閞BlendProps結(jié)構(gòu)長(zhǎng)度是4個(gè)字節(jié)。
而Long類型變量的長(zhǎng)度也是4個(gè)字節(jié),那么我們就可以程序中通過API函數(shù)CopyMemory將一個(gè)rBlendProps結(jié)構(gòu)拷貝到blendFunct 中。
在Form1中添加兩個(gè)PictureBox控件,其中Picture2為源,Picture1為拷貝目標(biāo),將兩者的ScaleMode都設(shè)置為3-Pixel將兩者的AutoRedraw屬性都設(shè)置為True,然后分別添加圖像。在加入一個(gè)Timer控件以及一個(gè)CommandButton控件,然后在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
運(yùn)行程序,點(diǎn)擊Command1,就可以看到Picture2圖像拷貝到Picture1上的淡入淡出效果了。
在結(jié)構(gòu)rBlendProps中,最重要的參數(shù)就是tBlendAmount,該值決定了源與目標(biāo)之間的透明程序。如果為0的話,源完全透明,如果為255的話,源完全覆蓋目標(biāo)。
另外AlphaBlend 函數(shù)不只用于兩個(gè)PictureBox之間的拷貝,而且可以在兩個(gè)Device Context之間的透明拷貝,也就是說,象窗口等控件之間也可以實(shí)現(xiàn)透明效果。