Chinaunix首页 | 论坛 | 博客
  • 博客访问: 517279
  • 博文数量: 252
  • 博客积分: 6057
  • 博客等级: 准将
  • 技术积分: 1635
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-21 10:17
文章分类

全部博文(252)

文章存档

2013年(1)

2012年(1)

2011年(32)

2010年(212)

2009年(6)

分类:

2010-08-09 11:16:41

2006-08-28 作者:■茅煦鹏 福州 来源:cfan.com.cn




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




阅读(3402) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chulia200020012010-08-09 11:18:26

C++Builder/Delphi中透明Panel及透明窗口的实现方法 http://www.pcdog.com/edu/bcb/20/11/p240398.html

chinaunix网友2010-08-09 11:17:51

Delphi做的透明PANEL http://blog.chinaunix.net/u/25199/showart_203349.html unit Glass; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TGlassStyle = ( gsBlackness, gsDstInvert, gsMergeCopy, gsMergePaint, gsNotSrcCopy, gsNotSrcErase, gsPatCopy, gsPatInvert, gsPatPaint, gsSrcAnd, gsSrcCopy, gsSrcErase, gsSrcInvert, gsSrcPaint, gsWhiteness); TGlass = class(TCustomControl) private FColor: TColor; FStyle: