ITPub博客

首页 > 应用开发 > IT综合 > 利用API函数实现图像淡入淡出效果 (转)

利用API函数实现图像淡入淡出效果 (转)

原创 IT综合 作者:amyz 时间:2007-10-02 10:47:24 0 删除 编辑
利用API函数实现图像淡入淡出效果 (转)[@more@]利用<a href="tag-153-1.html">api</a><a href="tag-266-1.html">函数</a>实现图像淡入淡出效果 一般传统的实现两个PictureBox之间图像的淡入淡出效果都需要使用大量的API函数并进行复杂的调色板以及 绘图设备(Device Context)的操作。但是在<a href="tag-108-1.html">win98</a>、<a href="tag-116-1.html">win2000</a>中,<a href="tag-91-1.html"><a href="leibie-13-1.html">微软</a></a>提供了支持透明图像拷贝的AlphaBlend函数。 这篇文章就介绍如何通过API函数AlphaBlend实现PictureBox之间图像的淡入淡出效果。AlphaBlend函数的定义在 msimg32.dll中,一般Win98、Win2000都带了这个库,在<a href="tag-255-1.html">编程</a>之前你可以先察看一下该<a href="tag-418-1.html">文件</a>是否存在。 打开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, <a href="tag-162-1.html">source</a> As Any, ByVal Length As Long) 大家可以看到,AlphaBlend函数的定义同普通的复制函数Bitblt很相似,只是最后的参数blendFunct定义为一个 rBlendProps结构。那么为什么在函数定义中blendFunct 定义为Long类型呢?因为rBlendProps结构长度是4个字节。 而Long类型变量的长度也是4个字节,那么我们就可以<a href="tag-254-1.html">程序</a>中通过API函数CopyMemory将一个rBlendProps结构拷贝到 blendFunct 中。 在Form1中添加两个PictureBox<a href="tag-264-1.html">控件</a>,其中Picture2为源,Picture1为拷贝目标,将两者的ScaleMode都设置为3-Pixel 将两者的AutoRedraw属性都设置为True,然后分别添加图像。在加入一个Timer控件以及一个Comman<a href="tag-57-1.html">db</a>utton控件,然后 在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的<a href="tag-268-1.html">bug</a>,就是在我写完 程序后,并没有出现透明复制的效果。搞的我以为该函数不起作用,但是当我再打开VB运行上面的程序后,一切有正常了。 我在MSDN上也没有找到相关的Bug列表。 www.applevb.com

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752019/viewspace-974386/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    3984
  • 访问量
    7338477