半透明窗体并不是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指令集的处理器中才起作用”不知是真是假,由于手头没有这样的电脑,还请同志们自己验证吧。