用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