[轉貼]如何製作半透明視窗

有關Delphi 的語法, 程式, 等
回覆文章
頭像
tim
文章: 1380
註冊時間: 2008年 11月 26日, 00:49

[轉貼]如何製作半透明視窗

文章 tim »

PS. 在 delphi 6 起已支援 AlphaBlend 的屬性了. 可以不需自已寫下面這段程式.
相關文章: http://delphi.ktop.com.tw/topic.asp?topic_id=26955
元件性的透明: http://delphi.ktop.com.tw/TOPIC.ASP?TOPIC_ID=28175, http://delphi.ktop.com.tw/topic.asp?topic_id=32751,

轉貼自: http://delphi.ktop.com.tw/topic.asp?topic_id=23161

在windows2000/windows XP下:

unit Unit1;

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.

基本原理是:
在視窗顯示前其獲取背景圖然后對背景圖象進行濾鏡效果處理再將處理過的背景圖象
顯示在視窗前面。 有一種方法是:首先,做出一個透明窗體,然后在窗體上添加一個shape,
將其擴展至全螢幕幕,將shape的pen的mode屬性設為pmmask,pen的style屬性設為psclear,
最后改變brush的color屬性即可。 因為沒有api支持,win9x下只能模擬,效果不太好,
就象金山詞霸的取詞視窗,背景改變而窗體上還是不變。但我們可以利用timer控件來解決
窗體的刷新率和時時更新的問題。 不過聽說“金山詞霸的半透明視窗效果只能在帶mmx指令集的處理器中才起作用”
http://www.delphibbs.com/delphibbs/dispq.asp?lid=852988
多多留言, 整理文章, 把經驗累積下來.....
回覆文章