zoukankan      html  css  js  c++  java
  • 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函数,通过这个函数来实现窗体透明方式,这种方法与网上的大多数方法类似,只是是加了一个类进行了封装

  • 相关阅读:
    kubernetes进阶(一) kubectl工具使用详解
    二进制安装kubernetes(七) 部署知识点总结
    1024程序员节:这就是国内开发者的现状?
    php 伪协议
    浅谈 PHP 与手机 APP 开发(API 接口开发)
    比RBAC更好的权限认证方式(Auth类认证)
    PHP获得毫秒数
    2020年PHP面试题附答案(实战经验)
    分享几套2019年各大公司最新的PHP面试题,几斤几两一试便知
    PHP面试题2019年百度工程师面试题及答案解析
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6944448.html
Copyright © 2011-2022 走看看