1、VB 利用 API 函数实现图像淡入淡出(2008-11-07 23:18:40)标签:vb api 图像淡入淡出 it 分类:VB一般传统的实现两个 PictureBox 之间图像的淡入淡出效果都需要使用大量的 API 函数并进行复杂的调色板以及绘图设备(Device Context)的操作。但是在 Win98、Win2000 中,微软提供了支持透明图像拷贝的 AlphaBlend 函数。这篇文章就介绍如何通过 API 函数 AlphaBlend 实现 PictureBox 之间图像的淡入淡出效果。AlphaBlend 函数的定义在 msimg32.dll 中,一般 Win98、Win200
2、0 都带了这个库,在编程之前你可以先察看一下该文件是否存在。打开 VB 建立一个新工程。选择菜单 Project | Add Module 添加一个模块到工程中,在其中输入以下代码:Public Type rBlendPropstBlendOp As BytetBlendOptions As BytetBlendAmount As BytetAlphaType As ByteEnd TypePublic Declare Function AlphaBlend Lib “msimg32“ (ByVal hDestDC As Long, _ByVal x As Long, ByVal y As L
3、ong, 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 BooleanPublic Declare Sub CopyMemory Lib “kernel32“ Alias “RtlMoveMemory“ _(Destination As Any, Source As A
4、ny, ByVal Length As Long)大家可以看到,AlphaBlend 函数的定义同普通的复制函数 Bitblt 很相似,只是最后的参数 blendFunct 定义为一个 rBlendProps 结构。那么为什么在函数定义中 blendFunct 定义为 Long 类型呢?因为 rBlendProps 结构长度是 4 个字节。而 Long 类型变量的长度也是 4 个字节,那么我们就可以程序中通过 API 函数 CopyMemory 将一个 rBlendProps 结构拷贝到 blendFunct 中。在 Form1 中添加两个 PictureBox 控件,其中 Picture2
5、为源,Picture1 为拷贝目标,将两者的 ScaleMode 都设置为 3-Pixel 将两者的 AutoRedraw 属性都设置为 True,然后分别添加图像。在加入一个 Timer控件以及一个 CommandButton 控件,然后在 Form1 的代码窗口中添加如下代码:Dim lTime As ByteSub ShowTransparency(cSrc As PictureBox, cDest As PictureBox, _ByVal nLevel As Byte)Dim LrProps As rBlendPropsDim LnBlendPtr As LongcDest.ClsL
6、rProps.tBlendAmount = nLevelCopyMemory LnBlendPtr, LrProps, 4With cSrcAlphaBlend cDest.hDC, 0, 0, .ScaleWidth, .ScaleHeight, _.hDC, 0, 0, .ScaleWidth, .ScaleHeight, LnBlendPtrEnd WithcDest.RefreshEnd SubPrivate Sub Command1_Click()lTime = 0Timer1.Interval = 100Timer1.Enabled = TrueEnd SubPrivate Sub
7、 Timer1_Timer()lTime = lTime + 1ShowTransparency Picture2, Picture1, lTimeIf lTime = 255 ThenTimer1.Enabled = FalseEnd IfMe.Caption = Str(Int(lTime / 2.55) + “%“End Sub运行程序,点击 Command1,就可以看到 Picture2 图像拷贝到 Picture1 上的淡入淡出效果了。在结构 rBlendProps 中,最重要的参数就是 tBlendAmount,该值决定了源与目标之间的透明程序。如果为 0 的话,源完全透明,如果为 255 的话,源完全覆盖目标。另外 AlphaBlend 函数不只用于两个 PictureBox 之间的拷贝,而且可以在两个 Device Context 之间的透明拷贝,也就是说,象窗口等控件之间也可以实现透明效果。