透明窗体的实现

1.

#define  WS_EX_LAYERED 0x00080000 
#define  LWA_COLORKEY 1  //  Use color as the transparency color.
#define  LWA_ALPHA    2  //  Use bAlpha to determine the opacity of the layer

HMODULE hModule 
= GetModuleHandle( " User32.DLL " );

typedef BOOL (WINAPI
*  SETLAYEREDWND)( HWND, COLORREF, BYTE, DWORD);
SETLAYEREDWND SetLayeredWindowPtr 
=  NULL;
SetLayeredWindowPtr 
=  (SETLAYEREDWND)GetProcAddress(hModule,  " SetLayeredWindowAttributes " );

 

2.

SetTransparent (BYTE bAlpha)
{
    
if (SetLayeredWindowPtr == NULL)
        
return;

    
if (bAlpha < 255)
    
{
        
//  set layered style for the dialog
        SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
        
        
//  call it with 255 as alpha - opacity
        SetLayeredWindowPtr (m_hWnd, 0, bAlpha, LWA_ALPHA);
    }

    
else
    
{
        SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) 
& ~WS_EX_LAYERED);

        
// Ask the window and its children to repaint
        ::RedrawWindow(m_hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
    }

}


 

3.

SetTransparentColor (COLORREF col, BOOL bTrans)
{
    
if (SetLayeredWindowPtr == NULL)
        
return;

    
if (bTrans)
    
{
        
//  set layered style for the dialog
        SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
        
//  call it with 0 alpha for the given color
        SetLayeredWindowPtr (m_hWnd, col, 250, LWA_COLORKEY);
    }

    
else
    
{
        SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) 
& ~WS_EX_LAYERED);

        
// Ask the window and its children to repaint
        ::RedrawWindow(m_hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
    }

}

你可能感兴趣的:(透明窗体的实现)