用DELPHI實現透明以及半透明窗體

在QQ中,我可以調節面板的透明度。如果我們自己編程,應該如何實現呢?

(一)半透明窗體

在windows2000以及後續産品中下增加了一些API,可以輕易的實現半透明的窗體,源程序如下:

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

const//定義常量

WS_EX_LAYERED = $80000;

AC_SRC_OVER = $0;

AC_SRC_ALPHA = $1;

AC_SRC_NO_PREMULT_ALPHA = $1;

AC_SRC_NO_ALPHA = $2;

AC_DST_NO_PREMULT_ALPHA = $10;

AC_DST_NO_ALPHA = $20;

LWA_COLORKEY = $1;

LWA_ALPHA = $2;

ULW_COLORKEY = $1

ULW_ALPHA = $2

ULW_OPAQUE = $4

type

TForm1 = class(TForm)

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

function SetLayeredWindowAttributes(hwnd:HWND; crKey:Longint; bAlpha:byte; dwFlags:longint ):longint; stdcall; external user32;//函數聲明

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

var l:longint;

begin

l:=getWindowLong(Handle, GWL_EXSTYLE);

l := l Or WS_EX_LAYERED;

SetWindowLong (handle, GWL_EXSTYLE, l);

SetLayeredWindowAttributes (handle, 0, 180, LWA_ALPHA);

//第二個參數是指定透明顔色

//第二個參數爲0則使用第四個參數設置alpha值,從0到255

end;

end.

(二) 透明窗體的實現

將一個FORM變成透明的實質性手段就是攔截CMEraseBkgnd消息。

unit Utransform; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

type TForm1 = class(TForm)

private { Private declarations }

public { Public declarations }

PROCEDURE CMEraseBkgnd(var Message:TWMEraseBkgnd);Message WM_ERASEBKGND;

end;

var Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.CMEraseBkgnd(var Message: TWMEraseBkgnd);

begin

brush.style:=bsClear;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

Form1.Brush.Style := bsClear;//如果只攔截消息,沒有這裏的設置,窗內的標題欄一樣會顯示 Form1.BorderStyle := bsNone

end;

procedure TForm1.BitBtn1Click(Sender: TObject);

begin

close;

end;

 
編程實現窗體的半透明效果
編程實現窗體的半透明效果 作者:羅薔 發布時間:2001/03/16 文章摘要:  大家都知道Windows 2000支持淡入淡出的窗體顯示效果。如何讓自己的應用程序也具備這種效果呢?下文對此問題做出了解答。 正文: 編...查看完整版>>編程實現窗體的半透明效果
 
Delphi中如何做透明的窗體
我 想 做 一 個 透 明 的 Form不 是 用 一 個 bmp外 加 一 個 mask的 那 種 。 也 不 用 控 件 , 在 VB中 可 以使 用 幾 個 參 數 即 可 , ( 可 在 這 裏 找 到 QA000129“如何使窗口透明”) , 但 相 同 的 辦 ...查看完整版>>Delphi中如何做透明的窗體
 
利用自定義事件實現不同窗體間的通訊 -- Delphi篇
要實現子窗體與父窗體之間的通訊,有多種方法(比如:重載子窗體的構造函數,將父窗體的引用作爲參數傳遞給子窗體)。下面我要介紹的是利用自定義事件的方法,它能夠最大程度的避免模塊之間的耦合,充分體現面向對象...查看完整版>>利用自定義事件實現不同窗體間的通訊 -- Delphi篇
 
透明窗體的又一實現
前面拜讀過本站無數高手的許多好文章,受益非淺,首先向各位大俠致敬!今天編程偶有小得,不敢獨享,特拿出來與各位共享,希望對某些朋友有些許幫助。  透明窗體的問題相信大家已經很熟悉了,前面的幾期在線雜志也...查看完整版>>透明窗體的又一實現
 
半透明窗體的制作
摘要:半透明窗體的制作半透明窗體並不是Win2000的新特效,凡是用過金山詞霸的同志都會發現在屏幕取詞設置中有一個半透明背景的選項,這說明在Win98下是可以實現半透明窗口的。但我還是要首先談談在Win2000實現半透明...查看完整版>>半透明窗體的制作