用过Win2000 的朋友肯定知道Win2000 的“半透明效果”,它可以透视背景或底层的其他位图,而不是一般文章所介绍的不规则窗口技术。然而,本文将讨论在Win98环境中实现“半透明效果”的方 法。由于Delphi 在RAD 方面的优势,所以本文使用Del p h i 作为开发工具,看过本文以后,你会发现原来用Delphi 来实现是这么简单。
我们知道,在Delphi 中生成一个新的窗口时,会生成一个长方形的窗口并盖住背景。为了实现半透明效果,首先就得实现“透明”的效果,为此,我们需要截获
WM_ERASEBKGND 消息,传递给Windows一个处理过的标志就可以了。这样,我们程序的背景使用的就是原来处于窗体之后的背景,我们所要做的就是在这个背景上再加上我们 的图片。为此,需要调用Win98 系统msimg32.dll 中提供的AlphaBlend 函数,其原型为:
AlphaBlend(
HDC hdcDest,// 目标设备场景句柄
int nXOriginDest, // 指定目标矩形左上角的x 坐标
int nYOriginDest,// 指定目标矩形左上角的y 坐标
int nWidthDest,//指定目标矩形宽度
int hHeightDest,//指定目标矩形高度
HDC hdcSrc, //源设备场景句柄
int nXOriginSrc,// 指定源矩形左上角的x 坐标
int nYOriginSrc,// 指定源矩形左上角的y 坐标
int nWidthSrc,//指定源矩形宽度
int nHeightSrc,//指定源矩形高度
BLENDFUNCTION blendFunction // 设定AlphaBlend 处理的参数
);
具 体编程过程如下:以SemiTran 为名建立新的工程,文件另存为uSemiTransparent.pas。将窗体重命名为frmSemiTransparent。接下来给窗体添加一个计 时器(命名为tmrShowBitmap、Interval 为20)、一个Image 控件(命名为imgSrc、AutoSize 为True),设置imgSrc 的Picture 属性,调入相应的图片文件(如图
1)。使用Image 控件的好处是不用调用CreateCompatibleDC来建立源设备场景。
以下是用Delphi5.0 实现的具体例程,在Win98环境中测试通过,你可以根据注释很快在你的计算机上进一步完善。程序效果如图2 所示。
unit uSemiTransparent;
interface
uses ......//为节省篇幅,常用模块在本文中省略
type
TfrmSemiTransparent = class(TForm)
// 用于保存图片的控件
imgSrc: TImage;
// 控制透明程度的时钟
tmrShowBitmap: TTimer;
procedure tmrShowBitmapTimer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
// 使用Message 关键字进行消息截获
procedure OnEraseBkgnd(var Message:TWMEraseBkgnd);
Message WM_EraseBkgnd;
end;
var
frmSemiTransparent: TfrmSemiTransparent;
bf: _BLENDFUNCTION; //AlphaBlend透明函数结构
nWidth: Integer; //图片宽度
nHeight: Integer; //图片高度
nCount: Integer; //透明度
implementation
{$R *.DFM}
// 截获WM_ERASEBKGND 消息,实现透明背景
procedure TfrmSemiTransparent.OnEraseBkgnd(var Message: TWMEraseBkgnd);
begin
Message.Result := 1; //设置消息已处理标志
end;
// 时钟事件处理函数
procedure TfrmSemiTransparent.tmrShowBitmapTimer(Sender: TObject);
begin
nCount := nCount +1;
if nCount>250 then
begin
tmrShowBitmap.Enabled := False;
frmSemiTransparent.Hide;
frmSemiTransparent.Close;
end;
bf.SourceConstantAlpha := nCount; //设置透明程度
AlphaBlend(frmSemiTransparent.Canvas.Handle,//窗口设备句柄
0, 0, nWidth, nHeight, imgSrc.Canvas.Handle, //保存图片的设备句柄
0, 0, nWidth, nHeight, bf);
end;
// 初始化变量和窗口类型
procedure TfrmSemiTransparent.FormCreate(Sender: TObject);
begin
frmSemiTransparent.BorderStyle := bsNone;
frmSemiTransparent.Position := poDesktopCenter;
nWidth := imgSrc.Width;
nHeight := imgSrc.Height;
nCount := 0;
bf.BlendOp := AC_SRC_OVER;
bf.BlendFlags := 0;
bf.SourceConstantAlpha := nCount;
bf.AlphaFormat := 0;
SetWindowPos(Handle,HWND_TOP, 0,0,nWidth-1, nHeight-1,0);
tmrShowBitmap.Enabled :=True;
end;
end.

posted on 2013-08-23 14:00  倾天  阅读(596)  评论(0编辑  收藏  举报