程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> DELPHI實現半透明效果

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;
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved