unit WinLayer;interfaceuses Windows;const WS_EX_LAYERED = $80000; LWA_COLORKEY = 1; LWA_ALPHA = 2;var SetLayeredWindowAttributes: function (Handle: HWnd; crKey: TCOLORREF; bAlpha: Byte; dwFlags: DWord): Boolean; stdcall;function IsFeatureEnabled: Boolean; function SetWindowTransparency(Handle: HWnd; Percent: Byte): Boolean;implementationvar FeatureEnabled: Boolean; Initialized: Boolean;function InitLayeredWindows: Boolean; var Module: THandle; begin Result:=True; Module:=LoadLibrary('user32.dll'); if (Module=0) then begin Result:=False; Exit; end; SetLayeredWindowAttributes:=GetProcAddress(Module, 'SetLayeredWindowAttributes'); if (Assigned(SetLayeredWindowAttributes)) then FeatureEnabled:=True; Initialized:=True; end;function IsFeatureEnabled: Boolean; begin Result:=True; if (not Initialized) then Result:=InitLayeredWindows; Result:=Result and FeatureEnabled; end;function SetWindowTransparency(Handle: HWnd; Percent: Byte): Boolean; begin Result:=True; if (not Initialized) then Result:=InitLayeredWindows; if ((Result) and (FeatureEnabled)) then begin if (Percent<>0) then begin SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED); SetLayeredWindowAttributes(Handle, 0, (255 * Percent) div 100, LWA_ALPHA); end else begin SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) xor WS_EX_LAYERED); end; end; end;initialization FeatureEnabled:=False; Initialized:=False; end. 这里有一个,到底那里是设为半透明的代码阿
如何制作透明窗体 使用SetLayeredWindowAttributes可以方便的制作透明窗体,此函数在w2k以上才支持,而且如果希望直接使用的话,可能需要下载最新的SDK。不过此函数在w2k的user32.dll里有实现,所以如果你不希望下载巨大的sdk的话,可以直接使用GetProcAddress获取该函数的指针。 SetLayeredWindowAttributes的函数原型如下:BOOL SetLayeredWindowAttributes( HWND hwnd, // handle to the layered window COLORREF crKey, // specifies the color key BYTE bAlpha, // value for the blend function DWORD dwFlags // action ); Windows NT/2000/XP: Included in Windows 2000 and later. Windows 95/98/Me: Unsupported.(注意了,在win9x里没法使用的) Header: Declared in Winuser.h; include Windows.h. Library: Use User32.lib. 一些常量: WS_EX_LAYERED = 0x80000; LWA_ALPHA = 0x2; LWA_COLORKEY=0x1; 其中dwFlags有LWA_ALPHA和LWA_COLORKEY LWA_ALPHA被设置的话,通过bAlpha决定透明度. LWA_COLORKEY被设置的话,则指定被透明掉的颜色为crKey,其他颜色则正常显示. 要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性(旧的sdk没有定义这个属性,所以可以直接指定为0x80000). 例子代码: 在OnInitDialog()加入: //加入WS_EX_LAYERED扩展属性 SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE, GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000); HINSTANCE hInst = LoadLibrary("User32.DLL"); if(hInst) { typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD); MYFUNC fun = NULL; //取得SetLayeredWindowAttributes函数指针 fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); if(fun)fun(this->GetSafeHwnd(),0,128,2); FreeLibrary(hInst); } 稍加修改还可以作出淡出淡入的效果. 注意第三个参数(128)不要取得太小了,为0的话就完全透明,看不到了。 函数SetLayeredWindowAttributes 使用这个函数,可以轻松的实现半透明窗体。按照微软的要求,透明窗体窗体在创建时应使用WS_EX_LAYERED参数(用CreateWindowEx),或者在创建后设置该参数(用SetWindowLong),我选用后者。全部函数、常量声明如下: Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long 其中hwnd是透明窗体的句柄,crKey为颜色值,bAlpha是透明度,取值范围是[0,255],dwFlags是透明方式,可以取两个值:当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;当取值为LWA_COLORKEY时,bAlpha参数有效而窗体中的所有颜色为crKey的地方将变为透明--这个功能很有用:我们不必再为建立不规则形状的窗体而调用一大堆区域分析、创建、合并函数了,只需指定透明处的颜色值即可,哈哈哈哈!请看具体代码。 Private Const WS_EX_LAYERED = &H80000 Private Const GWL_EXSTYLE = (-20) Private Const LWA_ALPHA = &H2 Private Const LWA_COLORKEY = &H1 代码一:一个半透明窗体 Private Sub Form_Load() Dim rtn As Long rtn = GetWindowLong(hwnd, GWL_EXSTYLE) rtn = rtn Or WS_EX_LAYERED SetWindowLong hwnd, GWL_EXSTYLE, rtn SetLayeredWindowAttributes hwnd, 0, 200, LWA_ALPHA End Sub 代码二:形状不规则的窗体 Private Sub Form_Load() Dim rtn As Long BorderStyler=0 rtn = GetWindowLong(hwnd, GWL_EXSTYLE) rtn = rtn Or WS_EX_LAYERED SetWindowLong hwnd, GWL_EXSTYLE, rtn SetLayeredWindowAttributes hwnd, &HFF0000, 0, LWA_COLORKEY ’将扣去窗口中的蓝色 End Sub 半透明窗体的又一种想法 作者: 张泰立 评价: 上站日期: 2001-06-29 内容说明: 来源: --------------------------------------------------------------------------------其实很简单,现有任一种方法制作一个透明窗体,我试过捕获屏幕、设置窗体brush属性、以及通过windows api函数改变三种制作透明窗体的方法都行。然后在窗体上添加一个shape,将其扩展至全屏幕,将shape的pen属性的mode设为pmmask,pen的style属性该为psclean,然后改变brush的color属性,即可进行透明的调节,不仅可以改变透明度,而且可以改变覆盖的颜色。就享用directx生成的效果。 其实巧用delphi的canvas类,可以是按许多图形效果。毕竟是用windows2000的还是少数。
半透明窗体(win2000特有API)
2001-11-24· · ··yesky Windows2000已经出了一年多了,就先介绍一下Windows2000特有的API吧!! AnimateWindow是一个窗口打开和关闭时产生动画效果的新函数,因为是一个新的函数, 所以在 API Viewer中是找不到的,必需自己定义: Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long '具体可以使用的常量及其用法 Const LWA_ALPHA=&H2 '表示把窗体设置成半透明样式 Const LWA_COLORKEY=&H1 '表示不显示窗体中的透明色
具体例子 程序代码 Module1Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long Public Const WS_EX_LAYERED = &H80000 Public Const GWL_EXSTYLE = (-20) Public Const LWA_ALPHA = &H2 Public Const LWA_COLORKEY = &H1 Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Form1 Private Sub Form_Load() Dim rtn As Long rtn = GetWindowLong(Me.hwnd, GWL_EXSTYLE) '取的窗口原先的样式 rtn = rtn Or WS_EX_LAYERED '使窗体添加上新的样式WS_EX_LAYERED SetWindowLong Me.hWnd, GWL_EXSTYLE, rtn '把新的样式赋给窗体 SetLayeredWindowAttributes me.hwnd, 0, 192, LWA_ALPHA '把窗体设置成半透明样式,第二个参数表示透明程度 '取值范围0--255,为0时就是一个全透明的窗体了 End Sub 第二种使用方法 SetLayeredWindowAttributes Me.hWnd, &H0, 0, LWA_COLORKEY '表明不显示窗体中的透明色 '而第二个参数表示透明色为黑色,并且你可以用RGB函数来指定颜色值
98XXXX98那些平台应该也一次性解决
procedure TForm1.Button1Click(Sender: TObject); var HWndCalculator : HWnd; begin // 查找计算器句柄 HWndCalculator := FindWindow(nil, '计算器'); if HWndCalculator <> 0 then SendMessage(HWndCalculator, WM_CLOSE, 0, 0); //关闭计算器 end; 这是控制计算器的例子,我不知道如何修改为寻找当前激活的其他任意窗体再SendMessage(HWndCalculator, WM_CLOSE, 0, 0);把其设为半透明,此外,半透明的进度条也可以用此方法吗设置吗?编程实现窗体的半透明效果 如果你不是使用Windows2000+Delphi编程的话,我不想浪费你的时间。如果是,请继续。 大家都知道Windows 2000支持淡入淡出的窗体显示效果。如何让自己的应用程序也具备这种效果呢?前两天研究FormContainer的Form显示效果时(注:FormContainer是一个强大的Delphi特效处理控件,有兴趣的朋友可以访问http://www.billeniumsoft.com/),得高人告知,核心API函数就是SetLayeredWindowAttributes。 要实现淡入淡出效果,就需要实现窗口的可调整的透明效果。传统的Windows应用程序想实现透明效果,一般来说需要处理自己的窗口的WM_Paint消息,程序员需要GetDC获取屏幕的HDC,调用BitBlt函数将屏幕将要被覆盖的区域拷贝到内存的TBitmap对象中,然后对该Tbitmap的ScanLine二维数组逐象素的修改rgbtRed、rgbtGreen和rgbtBlue值。天哪,实在是太麻烦了。 Windows2000的API库中终于提供了半透明的窗体显示效果支持(虽然不是很完善)。要实现半透明的窗口效果,首先需要给创建的窗口添加WS_EX_LAYERED 扩展属性,这是一个新的窗口扩展属性,Delphi5并没有定义相应的常量和SetLayeredWindowAttributes函数,我们需要手工声明。function SetLayeredWindowAttributes(Handle: HWND; COLORKEY: COLORREF; Alpha: BYTE; Flags: DWORD): Boolean; stdcall; external 'USER32.DLL';Const WS_EX_LAYERED = $80000; LWA_ALPHA = 2; 我们调用GetWindowLong函数获取当前窗口的扩展属性,并调用SetWindowLong函数将新的WS_EX_LAYERED窗口扩展属性添加进去。procedure TForm1.FormCreate(Sender: TObject); begin SetWindowLong(Handle,GWL_EXSTYLE,GetWindowLong(Handle,GWL_EXSTYLE) or WS_EX_LAYERED); end; 现在我们的窗口已经可以调用SetLayeredWindowAttributes函数,通过设置该函数的Alpha参数,我们就可以看到窗口的效果的变化。procedure TForm1.Button1Click(Sender: TObject); begin SetLayeredWindowAttributes(Form1.Handle, 0, 180, LWA_ALPHA); end; 以下的VCL控件代码封装了SetLayeredWindowAttributes函数,编程时动态改变AlphaValue值,您就可以看到窗口的透明效果了。控件屏蔽了设计期的显示效果,如果读者愿意可以改为设计期效果可见,不过那样的话,一不小心,您可能就会找不着你要设计的窗体了 8-) unit TranForm; {DragonPC 2001.2.21 }interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms ;type TTranForm = class(TComponent) private FAlphaValue : integer ; FParentFormHandle : HWND ; procedure SetFAlphaValue(Alpha:integer) ; protected procedure UpdateDisplay ; public constructor Create(AOwner: TComponent); override; published property AlphaValue : integer read FAlphaValue write SetFAlphaValue ; end;procedure Register;function SetLayeredWindowAttributes(Handle: HWND; COLORKEY: COLORREF; Alpha: BYTE; Flags: DWORD): Boolean; stdcall; external 'USER32.DLL';implementationprocedure Register; begin RegisterComponents('Standard', [TTranForm]); end;procedure TTranForm.SetFAlphaValue(Alpha: integer); begin if (Alpha >= 0) and (Alpha < 256) then begin FAlphaValue := Alpha ; UpdateDisplay() ; end; end;procedure TTranForm.UpdateDisplay; begin if (csDesigning in ComponentState) then Exit ; SetLayeredWindowAttributes(FParentFormHandle, 0, FAlphaValue, 2); end;constructor TTranForm.Create(AOwner: TComponent); begin inherited; if (csDesigning in ComponentState) then Exit; FAlphaValue := 255 ; FParentFormHandle := TForm(AOwner).Handle ; SetWindowLong(FParentFormHandle, GWL_EXSTYLE, GetWindowLong(FParentFormHandle, GWL_EXSTYLE) or WS_EX_LAYERED); end;end. 谢谢您的莫大耐心得以看完此文,此文纯粹本着赚取china-pub"假币"目的所写,万一各位看官有任何的疑问,欢迎信至[email protected],谢谢。这个例子好复杂,我希望可以用SendMessage控制半透明属性可以帮忙吗?只是不知道可以在98下用吗?
PtsType = array [0..15, 0..1] of Integer;const
Pts: PtsType = ((0, 0), (800, 0), (800, 600),
(200, 600), (200, 220), (300, 280),
(265, 205), (350, 117), (205, 170),
(120, 90), (130, 200), (60, 350), (200, 220),
(200, 600), (0, 600), (0, 0));procedure THoleForm.Button1Click(Sender: TObject);
var
HRegion1: THandle;
begin
HRegion1 := CreatePolygonRgn (Pts,
sizeof (Pts) div 8, alternate);
SetWindowRgn (Handle, HRegion1, True);
end;
把你的代码写在上面我说的WM_Paint消息中。写一个伪代码给你。procedure WMPaint(var Msg: TWMPaint); Message WM_Paint;
begin
1:取得窗体矩形的大小。
2:复制桌面相应区域、相应大小的图片
3:拷贝在自己的矩形中。
end;
Form1.AlphaBlend:=True;
Form1.AlphaBlendValue:=100;
设置按钮事件,使当前窗体透明
Form1.AlphaBlend:=True;
Form1.AlphaBlendValue:=100;
-------------------------------------前提是WIN20000
Form1.AlphaBlendValue:=100;
-------------------------------------前提是WIN2000那没有98的阿,如果把这个属性作为变量赋予当前任意form呢
Windows;const
WS_EX_LAYERED = $80000; LWA_COLORKEY = 1;
LWA_ALPHA = 2;var
SetLayeredWindowAttributes: function (Handle: HWnd; crKey: TCOLORREF; bAlpha: Byte; dwFlags: DWord): Boolean; stdcall;function IsFeatureEnabled: Boolean;
function SetWindowTransparency(Handle: HWnd; Percent: Byte): Boolean;implementationvar
FeatureEnabled: Boolean;
Initialized: Boolean;function InitLayeredWindows: Boolean;
var Module: THandle;
begin
Result:=True;
Module:=LoadLibrary('user32.dll');
if (Module=0) then
begin
Result:=False;
Exit;
end;
SetLayeredWindowAttributes:=GetProcAddress(Module, 'SetLayeredWindowAttributes');
if (Assigned(SetLayeredWindowAttributes)) then FeatureEnabled:=True;
Initialized:=True;
end;function IsFeatureEnabled: Boolean;
begin
Result:=True;
if (not Initialized) then Result:=InitLayeredWindows;
Result:=Result and FeatureEnabled;
end;function SetWindowTransparency(Handle: HWnd; Percent: Byte): Boolean;
begin
Result:=True;
if (not Initialized) then Result:=InitLayeredWindows;
if ((Result) and (FeatureEnabled)) then
begin
if (Percent<>0) then
begin
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
SetLayeredWindowAttributes(Handle, 0, (255 * Percent) div 100, LWA_ALPHA);
end else
begin
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) xor WS_EX_LAYERED);
end;
end;
end;initialization
FeatureEnabled:=False;
Initialized:=False;
end.
这里有一个,到底那里是设为半透明的代码阿
把上面的单元复制到Unit2中,unit WinLayer改为unit Unit2
你要设置透明的窗体包含unit2单元
设置按钮事件
procedure TForm1.Button1Click(Sender: TObject);
begin
SetWindowTransparency(Form1.Handle,40);
end;
我试过啊
Form1.AlphaBlend:=True;
Form1.AlphaBlendValue:=100;
Form1.AlphaBlend:=True;
Form1.AlphaBlendValue:=100;
我的思路是用api的findwindows找到当前任意在顶部的form,马上用postmessage或sendmessage把AlphaBlend属性赋予这个form,和东方快译的翻译网页功能差不多,不知要不要时间控件来不断激活,解决就给分
使用SetLayeredWindowAttributes可以方便的制作透明窗体,此函数在w2k以上才支持,而且如果希望直接使用的话,可能需要下载最新的SDK。不过此函数在w2k的user32.dll里有实现,所以如果你不希望下载巨大的sdk的话,可以直接使用GetProcAddress获取该函数的指针。
SetLayeredWindowAttributes的函数原型如下:BOOL SetLayeredWindowAttributes(
HWND hwnd, // handle to the layered window
COLORREF crKey, // specifies the color key
BYTE bAlpha, // value for the blend function
DWORD dwFlags // action
);
Windows NT/2000/XP: Included in Windows 2000 and later.
Windows 95/98/Me: Unsupported.(注意了,在win9x里没法使用的)
Header: Declared in Winuser.h; include Windows.h.
Library: Use User32.lib.
一些常量:
WS_EX_LAYERED = 0x80000;
LWA_ALPHA = 0x2;
LWA_COLORKEY=0x1; 其中dwFlags有LWA_ALPHA和LWA_COLORKEY LWA_ALPHA被设置的话,通过bAlpha决定透明度. LWA_COLORKEY被设置的话,则指定被透明掉的颜色为crKey,其他颜色则正常显示. 要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性(旧的sdk没有定义这个属性,所以可以直接指定为0x80000). 例子代码: 在OnInitDialog()加入: //加入WS_EX_LAYERED扩展属性
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
HINSTANCE hInst = LoadLibrary("User32.DLL");
if(hInst)
{
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;
//取得SetLayeredWindowAttributes函数指针
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
if(fun)fun(this->GetSafeHwnd(),0,128,2);
FreeLibrary(hInst);
} 稍加修改还可以作出淡出淡入的效果. 注意第三个参数(128)不要取得太小了,为0的话就完全透明,看不到了。
函数SetLayeredWindowAttributes 使用这个函数,可以轻松的实现半透明窗体。按照微软的要求,透明窗体窗体在创建时应使用WS_EX_LAYERED参数(用CreateWindowEx),或者在创建后设置该参数(用SetWindowLong),我选用后者。全部函数、常量声明如下: Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long 其中hwnd是透明窗体的句柄,crKey为颜色值,bAlpha是透明度,取值范围是[0,255],dwFlags是透明方式,可以取两个值:当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;当取值为LWA_COLORKEY时,bAlpha参数有效而窗体中的所有颜色为crKey的地方将变为透明--这个功能很有用:我们不必再为建立不规则形状的窗体而调用一大堆区域分析、创建、合并函数了,只需指定透明处的颜色值即可,哈哈哈哈!请看具体代码。 Private Const WS_EX_LAYERED = &H80000 Private Const GWL_EXSTYLE = (-20) Private Const LWA_ALPHA = &H2 Private Const LWA_COLORKEY = &H1 代码一:一个半透明窗体 Private Sub Form_Load() Dim rtn As Long rtn = GetWindowLong(hwnd, GWL_EXSTYLE) rtn = rtn Or WS_EX_LAYERED SetWindowLong hwnd, GWL_EXSTYLE, rtn SetLayeredWindowAttributes hwnd, 0, 200, LWA_ALPHA End Sub
代码二:形状不规则的窗体 Private Sub Form_Load() Dim rtn As Long BorderStyler=0 rtn = GetWindowLong(hwnd, GWL_EXSTYLE) rtn = rtn Or WS_EX_LAYERED SetWindowLong hwnd, GWL_EXSTYLE, rtn SetLayeredWindowAttributes hwnd, &HFF0000, 0, LWA_COLORKEY ’将扣去窗口中的蓝色 End Sub
半透明窗体的又一种想法
作者: 张泰立 评价: 上站日期: 2001-06-29
内容说明:
来源: --------------------------------------------------------------------------------其实很简单,现有任一种方法制作一个透明窗体,我试过捕获屏幕、设置窗体brush属性、以及通过windows api函数改变三种制作透明窗体的方法都行。然后在窗体上添加一个shape,将其扩展至全屏幕,将shape的pen属性的mode设为pmmask,pen的style属性该为psclean,然后改变brush的color属性,即可进行透明的调节,不仅可以改变透明度,而且可以改变覆盖的颜色。就享用directx生成的效果。
其实巧用delphi的canvas类,可以是按许多图形效果。毕竟是用windows2000的还是少数。
2001-11-24· · ··yesky Windows2000已经出了一年多了,就先介绍一下Windows2000特有的API吧!! AnimateWindow是一个窗口打开和关闭时产生动画效果的新函数,因为是一个新的函数, 所以在 API Viewer中是找不到的,必需自己定义: Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long '具体可以使用的常量及其用法 Const LWA_ALPHA=&H2 '表示把窗体设置成半透明样式
Const LWA_COLORKEY=&H1 '表示不显示窗体中的透明色
具体例子 程序代码 Module1Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Public Const WS_EX_LAYERED = &H80000
Public Const GWL_EXSTYLE = (-20)
Public Const LWA_ALPHA = &H2
Public Const LWA_COLORKEY = &H1
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Form1 Private Sub Form_Load()
Dim rtn As Long rtn = GetWindowLong(Me.hwnd, GWL_EXSTYLE) '取的窗口原先的样式
rtn = rtn Or WS_EX_LAYERED '使窗体添加上新的样式WS_EX_LAYERED
SetWindowLong Me.hWnd, GWL_EXSTYLE, rtn '把新的样式赋给窗体 SetLayeredWindowAttributes me.hwnd, 0, 192, LWA_ALPHA '把窗体设置成半透明样式,第二个参数表示透明程度
'取值范围0--255,为0时就是一个全透明的窗体了 End Sub
第二种使用方法 SetLayeredWindowAttributes Me.hWnd, &H0, 0, LWA_COLORKEY
'表明不显示窗体中的透明色
'而第二个参数表示透明色为黑色,并且你可以用RGB函数来指定颜色值
98XXXX98那些平台应该也一次性解决
var
HWndCalculator : HWnd;
begin
// 查找计算器句柄
HWndCalculator := FindWindow(nil, '计算器');
if HWndCalculator <> 0 then
SendMessage(HWndCalculator, WM_CLOSE, 0, 0);
//关闭计算器
end;
这是控制计算器的例子,我不知道如何修改为寻找当前激活的其他任意窗体再SendMessage(HWndCalculator, WM_CLOSE, 0, 0);把其设为半透明,此外,半透明的进度条也可以用此方法吗设置吗?编程实现窗体的半透明效果
如果你不是使用Windows2000+Delphi编程的话,我不想浪费你的时间。如果是,请继续。
大家都知道Windows 2000支持淡入淡出的窗体显示效果。如何让自己的应用程序也具备这种效果呢?前两天研究FormContainer的Form显示效果时(注:FormContainer是一个强大的Delphi特效处理控件,有兴趣的朋友可以访问http://www.billeniumsoft.com/),得高人告知,核心API函数就是SetLayeredWindowAttributes。
要实现淡入淡出效果,就需要实现窗口的可调整的透明效果。传统的Windows应用程序想实现透明效果,一般来说需要处理自己的窗口的WM_Paint消息,程序员需要GetDC获取屏幕的HDC,调用BitBlt函数将屏幕将要被覆盖的区域拷贝到内存的TBitmap对象中,然后对该Tbitmap的ScanLine二维数组逐象素的修改rgbtRed、rgbtGreen和rgbtBlue值。天哪,实在是太麻烦了。
Windows2000的API库中终于提供了半透明的窗体显示效果支持(虽然不是很完善)。要实现半透明的窗口效果,首先需要给创建的窗口添加WS_EX_LAYERED 扩展属性,这是一个新的窗口扩展属性,Delphi5并没有定义相应的常量和SetLayeredWindowAttributes函数,我们需要手工声明。function SetLayeredWindowAttributes(Handle: HWND;
COLORKEY: COLORREF; Alpha: BYTE; Flags: DWORD): Boolean; stdcall; external 'USER32.DLL';Const
WS_EX_LAYERED = $80000;
LWA_ALPHA = 2; 我们调用GetWindowLong函数获取当前窗口的扩展属性,并调用SetWindowLong函数将新的WS_EX_LAYERED窗口扩展属性添加进去。procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(Handle,GWL_EXSTYLE,GetWindowLong(Handle,GWL_EXSTYLE) or WS_EX_LAYERED);
end; 现在我们的窗口已经可以调用SetLayeredWindowAttributes函数,通过设置该函数的Alpha参数,我们就可以看到窗口的效果的变化。procedure TForm1.Button1Click(Sender: TObject);
begin
SetLayeredWindowAttributes(Form1.Handle, 0, 180, LWA_ALPHA);
end; 以下的VCL控件代码封装了SetLayeredWindowAttributes函数,编程时动态改变AlphaValue值,您就可以看到窗口的透明效果了。控件屏蔽了设计期的显示效果,如果读者愿意可以改为设计期效果可见,不过那样的话,一不小心,您可能就会找不着你要设计的窗体了 8-) unit TranForm; {DragonPC 2001.2.21 }interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms ;type
TTranForm = class(TComponent)
private
FAlphaValue : integer ;
FParentFormHandle : HWND ;
procedure SetFAlphaValue(Alpha:integer) ;
protected
procedure UpdateDisplay ;
public
constructor Create(AOwner: TComponent); override;
published
property AlphaValue : integer read FAlphaValue write SetFAlphaValue ;
end;procedure Register;function SetLayeredWindowAttributes(Handle: HWND; COLORKEY: COLORREF;
Alpha: BYTE; Flags: DWORD): Boolean; stdcall; external 'USER32.DLL';implementationprocedure Register;
begin
RegisterComponents('Standard', [TTranForm]);
end;procedure TTranForm.SetFAlphaValue(Alpha: integer);
begin
if (Alpha >= 0) and (Alpha < 256) then begin
FAlphaValue := Alpha ;
UpdateDisplay() ;
end;
end;procedure TTranForm.UpdateDisplay;
begin
if (csDesigning in ComponentState) then Exit ;
SetLayeredWindowAttributes(FParentFormHandle, 0, FAlphaValue, 2);
end;constructor TTranForm.Create(AOwner: TComponent);
begin
inherited;
if (csDesigning in ComponentState) then Exit;
FAlphaValue := 255 ;
FParentFormHandle := TForm(AOwner).Handle ;
SetWindowLong(FParentFormHandle,
GWL_EXSTYLE,
GetWindowLong(FParentFormHandle, GWL_EXSTYLE) or WS_EX_LAYERED);
end;end. 谢谢您的莫大耐心得以看完此文,此文纯粹本着赚取china-pub"假币"目的所写,万一各位看官有任何的疑问,欢迎信至[email protected],谢谢。这个例子好复杂,我希望可以用SendMessage控制半透明属性可以帮忙吗?只是不知道可以在98下用吗?