发信人: forfar(别离歌) 
整理人: yangcs(2004-10-14 14:22:35), 站内信件
 | 
 
 
在应用程序中引入图片淡入及淡出,可以让用户界面更加美观。 以前报刊杂志中介绍的常用方法有两种:一是自己写程序,逐个象素进行混合渐变;二是使用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$既然保密,我们也无从可知,要是有哪位大侠知道,欢迎一起贴出来分享。 | 
 
 
 |