半透明窗體並不是Win2000的新特效,凡是用過金山詞霸的同志都會發現在屏幕取詞設置中有一個半透明背景的選項,這說明在Win98下是可以實現半透明窗口的。但我還是要首先談談在Win2000實現半透明窗體的新函數SetLayeredWindowAttributes。利用這個函數就可以輕松創建一個半透明窗體,但是利用這個函數的程序編譯後在Win98下是無法運行的。 SetLayeredWindowAttributes API函數介紹如下: 函數功能:設置窗口透明顏色 參數:SetLayeredWindowAttributes( HWND hwnd, //窗口手柄 COLORREF crKey, //指定顏色值 BYTE bAlpha, //混合函數值 DWORD dwFlags //動作 參數解釋: hwnd:窗口句柄。當使用CreateWindowEx函數創建窗口時,窗口由WS_EX_LAYERED指定的值創建;或者窗口已經創建後,由SetWindowLong根據WS_EX_LAYERED指定的值改變。 crKey:指向一個COLOR值,該值指定一個透明顏色值,當創建窗口時,窗口將使用該值。 bAlpha:混合函數值。該值用於描述窗口的不透明度。當bAlpha 值為0時,窗口完全透明,當bAlpha值為255時,窗口完全不透明。 dwFlags:指定動作。這個參數可以取一個或多個值。用它我們可以創建一個不規則的窗體。 SetLayeredWindowAttributes函數的API聲明: SetLayeredWindowAttributes(hwnd: HWND; crKey: DWORD;bAlpha: BYTE; dwFlag: DWord): Boolean; stdcall; ---------程序代碼1: const WS_EX_LAYERED = $80000; LWA_COLORKEY = $1; LWA_ALPHA = $2; 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, 180, 120, LWA_ALPHA); end;還有一些其它的常量定義如: AC_SRC_ALPHA = $1; AC_DST_NO_PREMULT_ALPHA = $10; ULW_COLORKEY = $1; ULW_ALPHA = $2; ULW_OPAQUE = $400; 等還要參看MSDN。有些我還沒有搞明白,如果哪位同志知道的話,請告訴我。 那麼在Win98下又是如何實現半透明窗體的呢?其基本原理是:在窗口顯示前其獲取背景圖然後對背景圖象進行濾鏡效果處理再將處理過的背景圖象顯示在窗口前面。 有一種方法是:首先,做出一個透明窗體,然後在窗體上添加一個Shape,將其擴展至全屏幕,將Shape的Pen的Mode屬性設為PmMask,Pen的Style屬性設為PsClear,最後改變Brush的Color屬性即可。 因為沒有API支持,Win9x下只能模擬,效果不太好,就象金山詞霸的取詞窗口,背景改變而窗體上還是不變。但我們可以利用Timer控件來解決窗體的刷新率和時時更新的問題。 不過聽說“金山詞霸的半透明窗口效果只能在帶MMX指令集的處理器中才起作用”不知是真是假,由於手頭沒有這樣的電腦,還請同志們自己驗證吧。