半透明視窗製作 |
|
flyup
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:280 回覆:508 積分:385 註冊:2002-04-15 發送簡訊給我 |
在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 發表人 - flyup 於 2002/11/23 00:56:36
![]() |
lcsboy
版主 ![]() ![]() ![]() ![]() ![]() 發表:87 回覆:622 積分:394 註冊:2002-06-18 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |