利用API函数实现图像淡入淡出效果 - 沐风经典

一般传统的实现两个PictureBox之间图像的淡入淡出效果都需要使用大量的API函数并进行复杂的调色板以及

绘图设备(Device Context)的操作。但是在Win98、Win2000中,微软提供了支持透明图像拷贝的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, Source 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控件以及一个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

运行程序,点击Command1,就可以看到Picture2图像拷贝到Picture1上的淡入淡出效果了。

在结构rBlendProps中,最重要的参数就是tBlendAmount,该值决定了源与目标之间的透明程序。如果为0的话,源完全

透明,如果为255的话,源完全覆盖目标。

另外AlphaBlend 函数不只用于两个PictureBox之间的拷贝,而且可以在两个Device Context之间的透明拷贝,也就是

说,象窗口等控件之间也可以实现透明效果。不过在编程过程中发现一个问题,不知是否是AlphaBlend的Bug,就是在我写完

程序后,并没有出现透明复制的效果。搞的我以为该函数不起作用,但是当我再打开VB运行上面的程序后,一切有正常了。

我在MSDN上也没有找到相关的Bug列表。

一般传统的实现两个PictureBox之间图像的淡入淡出效果都需要使用大量的API函数并进行复杂的调色板以及

绘图设备(Device Context)的操作。但是在Win98、Win2000中,微软提供了支持透明图像拷贝的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, Source 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控件以及一个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

运行程序,点击Command1,就可以看到Picture2图像拷贝到Picture1上的淡入淡出效果了。

在结构rBlendProps中,最重要的参数就是tBlendAmount,该值决定了源与目标之间的透明程序。如果为0的话,源完全

透明,如果为255的话,源完全覆盖目标。

另外AlphaBlend 函数不只用于两个PictureBox之间的拷贝,而且可以在两个Device Context之间的透明拷贝,也就是

说,象窗口等控件之间也可以实现透明效果。不过在编程过程中发现一个问题,不知是否是AlphaBlend的Bug,就是在我写完

程序后,并没有出现透明复制的效果。搞的我以为该函数不起作用,但是当我再打开VB运行上面的程序后,一切有正常了。

我在MSDN上也没有找到相关的Bug列表。


相关内容

  • C#与图片.天气预报
  • ★ C#实现百叶窗效果显示图片 百叶窗有两种显示效果,一种是垂直百叶窗,另一种是水平百叶窗. 实现百叶窗显示图像有两种方式:一是根据窗口或图像的高度或宽度和定制的百叶窗显示条宽度计算百叶窗的显示的条数量:二是根据窗口或图像的高度或宽度和定制的百叶窗显示条数量计算百叶窗的显示的条宽度. 垂直百叶窗实现 ...

  • 信息技术选考学考重要知识点整理
  • 信息技术必背重要知识点 信息基础重要考点 1. 信息与载体区分:文字.图像.声音都为信息的载体,而不是信息(例如:文字里面 所表达得意思才是信息,而文字本身并不是信息.) 2. 收藏夹用于收藏网址(保存网址),但不能保存网页内容. 3. 理解Word中查找替换(文章中某个词语替换成另一个).自动更正 ...

  • 决策指挥系统方案书
  • 数据交互管理中心 方案 一 概述 随着经济的高速发展和科技的飞速进步,各领域和行业都非常重视信息化建设,同时结合自身行业的特点,对信息化建设也提出了具体的功能的要求.对于需时时监测(监控).预警.处置突发事件的行业,如公安.武警.军事.消防.自然灾害.交管等,根据其业务特点,如能及时发现.预警,真确 ...

  • 清华版信息技术六年级上
  • 第4课 人物之美--处理图片 教学目标 知识与技能 1.认识冲印模式和编辑模式,知道两种模式的本质区别. 2.掌握根据需要,恰当利用冲印模式和编辑模式处理图片的基本方法. 3.掌握撤销冲印和编辑两种操作的方法. 4.掌握适当添加特效的方法. 过程与方法 通过任务驱动.交流展示等方式,充分调动学生的参 ...

  • 实验二数字音频资源的获取.处理与应用
  • 实验二 数字音频资源的获取.处理与应用 一.实验类型 1. 了解数字音频资源的常用格式 2. 学会数字音频资源的获取方法 3. 能够对数字音频资源进行简单的加工处理 4. 学会在多媒体课件.主题学习网站中使用数字音频资源的方法 二.实验目的 验证型实验 2学时 三.实验环境 1.能够连接Intern ...

  • 初二信息技术考试知识点
  • 单击"表格" →"选定" →选某项 制作多媒体作品的一般流程 时间轴.图层与帧 时间轴:用于组织和控制一定时间内的图层和帧中的文档内容. 时间轴左边为图层区,右边为帧区,动画从左向右逐帧进行播放. 在时间轴上,每一行就是一个图层,每一列就是一帧. 图层:相当于 ...

  • 单细胞拉曼光谱系统控制软件
  • 单细胞拉曼光谱系统控制软件 单细胞拉曼光谱系统控制软件是针对拉曼光谱系统的具体功能要求并结合硬件系统来进行设计和实现.根据硬件系统待实现的功能来对相应器件进行二次开发,以达到系统原位.实时.连续.自动获取单细胞拉曼光谱的目的. §1 单细胞拉曼光谱系统控制软件总体设计 §1.1 开发环境 本套系统软 ...

  • 转场剪辑的手法以及什么是光学转场剪辑
  • 转场剪辑的手法以及什么是光学转场剪辑 剪辑 剪辑(Film editing) ,即将影片制作中所拍摄的大量素材,经过选择.取舍.分解与组接,最终完成一个连贯流畅.含义明确.主题鲜明并有艺术感染力的作品.影片运用这种组接形式给予观众的直感极其强烈.节奏上形成突如其来的变化,产生一种特殊的效果.剪辑的手 ...

  • 浅谈视频编辑几种转场的方法与技巧
  • 浅谈视频编辑几种转场的方法与技巧 一部完整的电视作品由多个情节的段落所组成,而每一个情节的段落则由若干个蒙太奇镜头段落(或称蒙太奇句子)组成,每一个蒙太奇镜头段落又由一个或若干个镜头组成.场面的转换首先是镜头之间的转换,同时也包括蒙太奇镜头段落之间的转换和情节段落之间的转换.为了使电视片内容的条理性 ...