win32下实现透明窗口

最开始写透明窗口的代码,在百度了之后,找到了SetLayeredWindowAttributes()这一个函数,但是由于网上案列的缺少,使得很多人无法很好的使用这一个方法,我花了几天的时间写了一个实现窗口透明的类,在这里放出来,给大家使用



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


class CTransparent  
{
public:
    static BOOL SetTransparentWnd(HWND hWnd, COLORREF crKey, UINT cAlpha, BOOL dwFlags);
    static BOOL FreeUser32DLL();
    static BOOL ChangeTransparency(HWND hWnd,COLORREF crKey, UINT bAlpha, DWORD dwFlags);
    static BOOL LoadUser32DLL();

    static TRANFUNC m_pFunc;
    static HINSTANCE m_hInstance;
    static BOOL initialized;

};





HINSTANCE CTransparent::m_hInstance = NULL;
TRANFUNC  CTransparent::m_pFunc = NULL;
BOOL CTransparent::initialized = FALSE;
//
// Construction/Destruction
//
BOOL CTransparent::LoadUser32DLL()
{
    BOOL bRet = FALSE;
    if (!initialized)
    {
        m_hInstance = LoadLibrary(L"User32.DLL");
        if(m_hInstance ) 
        { 
          //取得SetLayeredWindowAttributes函数指针 
          m_pFunc=(TRANFUNC)GetProcAddress(m_hInstance, "SetLayeredWindowAttributes");
          if(m_pFunc != NULL)
            {
                 initialized = TRUE;
                 bRet = TRUE;
            }
        }
    }
    return bRet ;
}

BOOL CTransparent::ChangeTransparency(HWND hWnd, COLORREF crKey, UINT bAlpha, DWORD dwFlags)
{
    //透明度Sp的值是0-255 
    //其中0为完全透明应该避免出现
    BOOL bRet = FALSE;
    if (m_pFunc == NULL)
        LoadUser32DLL();    

    if(m_pFunc != NULL)
    {
         m_pFunc(hWnd, crKey, bAlpha, dwFlags); 
         bRet = TRUE;   
    }
    return bRet;
}

BOOL CTransparent::FreeUser32DLL()
{   
    if(m_hInstance != NULL)
     {  
         FreeLibrary(m_hInstance); 
        if(m_pFunc != NULL) //置空
         m_pFunc = NULL ;
        if(initialized != NULL)       //置空
         initialized  = NULL ;
     }
    return TRUE;
}

BOOL CTransparent::SetTransparentWnd(HWND hWnd, COLORREF crKey, UINT cAlpha, BOOL dwFlags)
{
    BOOL bRet = TRUE;   

    //要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性 WS_EX_LAYERED = 0x80000 
    //SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
    SetWindowLong(hWnd, 
        GWL_EXSTYLE , 
        GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);  
    
    if(dwFlags)
     {
        ChangeTransparency(hWnd, crKey, cAlpha, LWA_ALPHA); //设置cAlpha值0-255
     } 
    else
     {
        ChangeTransparency(hWnd, crKey, cAlpha, LWA_COLORKEY);    //crkey相同色变成透明
     }

    return bRet;
}

在这里调用这个静态方法即可.

	HWND m_hMyWnd = ::CreateWindow(L"LoginWndDLL", L"TraWnd", WS_POPUP,
		(int)((xRes - m_WndWidth) / 2), (int)((yRes - m_WndHeight) / 2), m_WndWidth, m_WndHeight, 0, 0, hInst, 0);
	//在这里注册一个窗口第三个参数表示窗口的类型
	CTransparent::SetTransparentWnd((HWND)m_hMyWnd, 0xffffff, 200, 2); //设置窗口透明
	::ShowWindow(m_hMyWnd, SW_SHOW);
实际上上面这个类使用了动态调用user32.dll中的SetLayeredWindowAttributes函数,通过这个函数来实现窗口透明方式,这个方法与网上的大多数方法类似,不过是加了一个类进行了封装

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值