设置窗口透明效果

设置窗口透明一般都能用分层窗体来实现,这样的代码到网上一搜一大把的,我在这里简单地封装一下以供以后自己方便地使用。
#ifndef   _WINDOW_TRANSPARENT_H_
#define   _WINDOW_TRANSPARENT_H_

#ifndef WS_EX_LAYERED
    
#define  LWA_COLORKEY            0x00000001
    
#define  LWA_ALPHA                   0x00000002
    
#define  WS_EX_LAYERED           0x00080000
#endif  

// 分层窗口只在WIndows 2000 及以后版本有效,故用 _WIN32_WINNT >= 0x0500做判断

class  CWindowTransparent
{
    typedef BOOL (WINAPI 
* LPFNSETLAYEREDWINDOWATTRIBUTES)(HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags); 
private :
    HMODULE   m_hModUser32;
    LPFNSETLAYEREDWINDOWATTRIBUTES  lpfnSetLayeredWindowAttributes;

public :
    CWindowTransparent( )
    {
#if  _WIN32_WINNT >= 0x0500
        
// 获取user32.dll模块
        m_hModUser32   =  ::GetModuleHandle( _T( " user32.dll " ) ); 
        ATLASSERT( ( m_hModUser32 
!=  NULL )  &&  ( _T( " Get user32.dll Module Failed! " )) );

        
// 获取SetLayeredWindowAttributes函数地址
        lpfnSetLayeredWindowAttributes   =   (LPFNSETLAYEREDWINDOWATTRIBUTES)::GetProcAddress( m_hModUser32,  " SetLayeredWindowAttributes "  ); 
        ATLASSERT( ( lpfnSetLayeredWindowAttributes 
!=  NULL )  &&  ( _T( " Get SetLayeredWindowAttributes Function Failed! " )) );
#endif
    }

    
/*
    * 通过RGB值设置窗口透明
    * hWnd: 要设置透明的窗口句柄
    * clrTran: 透明色
    
*/
    
void  SetWindowTransparentRGBStyle( HWND  hWnd,  COLORREF clrTran  =  RGB( 255 , 0 , 255 ))
    {
        ATLASSERT( ::IsWindow( hWnd ) );
        
// 设置窗口的扩展属性
        LONG lStyle  =  ::GetWindowLong( hWnd, GWL_EXSTYLE );
        ::SetWindowLong( hWnd, GWL_EXSTYLE, lStyle
| WS_EX_LAYERED ); 

#if  _WIN32_WINNT >= 0x0500
        lpfnSetLayeredWindowAttributes( hWnd, clrTran, 
255 , LWA_COLORKEY); 
#endif
    }

    
/*
    * 通过Alpha值设置窗口透明
    * hWnd: 要设置透明的窗口句柄
    * bAlpha: Alpha透明值
    
*/
    
void  SetWindowTransparentAlphaStyle( HWND  hWnd,  BYTE  bAlpha  =   255  )
    {
        ATLASSERT( ::IsWindow( hWnd ) );
        
// 设置窗口的扩展属性
        LONG lStyle  =  ::GetWindowLong( hWnd, GWL_EXSTYLE );
        ::SetWindowLong( hWnd, GWL_EXSTYLE, lStyle
| WS_EX_LAYERED ); 

#if  _WIN32_WINNT >= 0x0500
        lpfnSetLayeredWindowAttributes( hWnd, RGB(
0 , 0 , 0 ), bAlpha, LWA_ALPHA ); 
#endif
    }
};


#endif

你可能感兴趣的:(透明)