用SetLayeredWindowAttributes函数设置透明窗体

发布时间:2010年12月29日 作者:未知 查看次数:1661

用SetLayeredWindowAttributes函数设置透明窗体


用SetLayeredWindowAttributes函数设置透明窗体

使用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  
  );    
   
  Requirements  
  Windows   NT2000XP   Included   in   Windows   2000   and   later.  
  Windows   9598Me   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函数
SetLayeredWindowAttributes  Public 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为掩码的颜色,可以用RGB(r,g,b)来指定。
  bAlpha是不透明度,取值范围是(0,255),其中0代表全透明,255代表不透明。
  dwFlags是透明方式,可以取两个值:
  当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;
  当取值为LWA_COLORKEY时,窗体中的所有颜色为crKey的地方将变为透明,bAlpha参数无效。
  LWA_ALPHA = 0x2
  LWA_COLORKEY=0x1
  也可以取两个值的组合:LWA_ALPHA Or LWA_COLORKEY。这样crKey的地方将变为全透明,而其它地方根据bAlpha参数确定透明度。
  要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性,方法:
  先声明GetWindowLong和SetWindowLong
  Dim rtn As Long
  rtn = GetWindowLong(Me.hWnd, -20)
  rtn = rtn Or WS_EX_LAYERED
  SetWindowLong Me.hWnd, -20, rtn
  
  (旧的sdk没有定义WS_EX_LAYERED,所以可以直接指定为&H80000).
  WS_EX_LAYERED = &H80000



版权所有!www.sieye.cn
E.Mail:sieye@sohu.com QQ:66697110