在应用程序中引入图片淡入及淡出,可以让用户界面更加美观。 以前报刊杂志中介绍的常用方法有两种:一是自己写程序,逐个象素进行混合渐变;二是使用DirectX,建立一个带Alpha通道的Surface。
第一种,效果可以自己控制,但比较麻烦,而且一般不容易生成硬件优化的代码;
第二种速度很快,却需要使用DirectX库。其实在Windows的GDI中已经提供了一个很好的API――AlphaBlend,既保证速度又很简单。
function AlphaBlendA(DestDC: HDC; TopDest, LeftDest, WidthDest, HeightDest: Integer; SrcDC: HDC; TopSrc, LeftSrc, WidthSrc, HeightSrc: Integer; BlendFunction: TBlendFunction): BOOL; stdcall; // API函数声明
其中DestDC参数是生成画面的Handle,TopDest, LeftDest, WidthDest, HeightDest是生成画面的右上角坐标和长宽值;SrcDC, TopSrc, LeftSrc, WidthSrc, HeightSrc表示原图的相关参数,因为AlphaBlend会自动处理缩放,所以WidthDest, Height, LeftSrc, WidthSrc可以为不同值;DestBlendFunction是控制 Alpha 混合的结构。
DestBlendFunction这个结构,是AlphaBlend的使用中最重要的参数,它的定义如下:
typedef struct _BLENDFUNCTION
{
BYTE BlendOp;
BYTE BlendFlags;
BYTE SourceConstantAlpha;
BYTE AlphaFormat;
}BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;
BlendOP是混合方式,当前只有AC_SRC_OVER一种,即将SrcDC放置于DstDC之上,进行混合;
BlendFlags必须为零,为什么呢?M$没有告诉我们。
SourceConstantAlpha控制SrcDC画面的透明度,为0时,完全透明;为255时,完全不透明,其间逐渐变化。
AlphaFormat表示SrcDC和DstDC的格式,缺省为零,一般不用指定。
利用AlphaBlend还可以产生其它图象效果,比如将SourceConstantAlpha适当居中,能象PhotoShop一样出现“浮雕”的效果等。
在msimg32.dll中,除了AlphaBlend,还有TransparentBlt和GradientFill等很有用的API:TransparentBlt可以快速处理16色和256色的透明贴图(AlphaBlend可以处理32位色),以前有些文章建议不要在WIN98下使用,说会引起“资源泄露”,我想可能是因为它不支持32位色的缘故;GradientFill则能够借助硬件加速,产生颜色渐变的三角形或矩形,利用上它们,将会让你编写的程序更加吸引人。
msimg32.dll中应该还有其他很有用的函数,但M$既然保密,我们也无从可知,要是有哪位大侠知道,欢迎一起贴出来分享。