WinAPI透明窗体SetLayeredWindowAttributes

SetLayeredWindowAttributes 
BOOL SetLayeredWindowAttributes(           
     HWND hwnd, 
     COLORREF crKey, 
     BYTE bAlpha, 
     DWORD dwFlags 
); 

hwnd是透明窗体的句柄, 
crKey为颜色值, 
bAlpha是透明度,取值范围是[0,255], 
dwFlags是透明方式,可以取两个值: 
          当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效; 
          当取值为LWA_COLORKEY时,bAlpha参数有效而窗体中的所有颜色为crKey的地方将变为透明。 
          LWA_ALPHA = 0x2 
          LWA_COLORKEY=0x1 

要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性 
(旧的sdk没有定义这个属性,所以可以直接指定为0x80000). 
WS_EX_LAYERED = 0x80000    

----------------------------------------------------------------------------------------- 
SetWindowLong(

    this->GetSafeHwnd(),

    GWL_EXSTYLE, 
    GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE) | 0x80000

    );

//获取SetLayeredWindowAttributes地址
HINSTANCE hInst=LoadLibrary("User32.DLL"); 
if(hInst) 

     typedef BOOL     (WINAPI * MYFUNC)(HWND,COLORREF,BYTE,DWORD); 
     MYFUNC pSetLayeredWindowAttributes=NULL; 

     //取得SetLayeredWindowAttributes函数指针 
     pSetLayeredWindowAttributes = (MYFUNC)GetProcAddress(hInst,"SetLayeredWindowAttributes"); 
     if(pSetLayeredWindowAttributes) 
      pSetLayeredWindowAttributes(this->GetSafeHwnd(),0,128,2); 
     FreeLibrary(hInst); 


可以看到这是动态的从User32.dl中取得函数地址然后调用的.而我在VS2005环境下可以直接使用SetLayeredWindowAttributes,代码如下: 
     SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^WS_EX_LAYERED); 
     SetLayeredWindowAttributes(this->m_hWnd,0,100,2); 
而如果在VC6下面使用这样的代码将来报错误:找不到标识符SetLayeredWindowAttributes.为什么呢? 
原来SetLayeredWindowAttributes函数只有在Win2000以上的系统才支持,而VC是98年的产物(快10年了),它自带的SDK自然也是98年的,所以才没有这个函数的头文件和对应的Lib.知道原因后就好办了,首先下载SDK,开始想下个最新的.是06年的Win2003的,但从说明中看到不支持VC,没办法,接着找,终于被我找到XPSP2的一个SDK,下载地址是:http://www.microsoft.com/msdownload/platformsdk/sdkupdate/XPSP2FULLInstall.htm,下载后解压CAB,安装,通过开始菜单中的设置环境变量,手动的在VC6的选项中增加对SDK目录的Include和Lib的条目,再次编译终于通过.但美中不足的是,新增加的函数没有语法提示:( 
最后说一下,上面的两种写法,第一种还是比较稳妥的,因为在98下就会找不到这个函数的地址,但是估计第二种也不会有什么问题,必竟现在是XP的天下,95,98,ME只是我夸口自己玩电脑N年的谈资了.呵呵. 

---------------------------------------------------------------------------------------- 
VB下的用法示例: 

函数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

----------------------------------------------------------------------------------------

Delphi 调用实例:

----------------------------------------------------------------------------------------

//声明:
SetLayeredWindowAttributes(
Hwnd: THandle;   {窗口句柄}
crKey: COLORREF; {透明色}
bAlpha: Byte;    {Alpha 值}
dwFlags: DWORD   {LWA_COLORKEY(=1)表示使用透明色; LWA_ALPHA(=2)表示使用 Alpha 值}
): Boolean;        {是否成功设置}




//举例(控制外部程序的透明度, 用计算器举了个例子):
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{设定计算器的 Alpha 透明}
procedure TForm1.Button1Click(Sender: TObject);
var
h: HWND;
FormStyle: Integer;
begin
h := FindWindow('SciCalc'nil);
FormStyle := GetWindowLong(Handle, GWL_EXSTYLE);
SetWindowLong(h, GWL_EXSTYLE, FormStyle or WS_EX_LAYERED);
SetLayeredWindowAttributes(h, 0128, LWA_ALPHA);
end;

{设定计算器中的白色透明}
procedure TForm1.Button2Click(Sender: TObject);
var
h: HWND;
FormStyle: Integer;
begin
h := FindWindow('SciCalc'nil);
FormStyle := GetWindowLong(Handle, GWL_EXSTYLE);
SetWindowLong(h, GWL_EXSTYLE, FormStyle or WS_EX_LAYERED);
SetLayeredWindowAttributes(h, clWhite, 255, LWA_COLORKEY);
end;

end.

 

转自: http://hi.baidu.com/qqlt/blog/item/3182fbd35895d7d6a8ec9a7a.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值