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

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 firetoucher 的 blog

利用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列表。

本文关键:API
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top