精品主页 | 软件下载 | 系统下载 | 精品导航| 精彩图片 | 转帖工具 | 版主申请 | 影视下载
发新话题
打印

DELPHI实现半透明效果

DELPHI实现半透明效果

  


                  用过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.

TOP

发新话题