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函数,通过这个函数来实现窗口透明方式,这个方法与网上的大多数方法类似,不过是加了一个类进行了封装

时间: 2024-10-10 08:55:03

win32下实现透明窗口的相关文章

sqlmap win32下命令集合

http://testphp.vulnweb.com/artists.php?artist=1    #库 注意:--前面有一个空格 C:\Python27\sqlmap>sqlmap.py -u "http://testphp.vulnweb.com/artists.php?artist=1" --current-db current database:    'acuart' ##################################################

win32下PE文件分析之节表

接上一篇的win32下PE文件分析之NT头 (一).FileBuffer与ImageBuffer (1).FileBuffer是将文件原原本本的读入申请的内存区域中,那部分区域就是FileBuffer,里面的内容与磁盘中的文件一模一样.如下图: (2).ImageBuffer是按照一定规则加载到内存中的某个区域,并且通过一定的处理,能立刻执行的区域,那部分区域叫做ImageBuffer.其大小就是可选PE头中的SizeOfImage.结构如下图: (3).二者之间的关系: ImageBuffer

win32下PE文件分析之DOS头

(一).win32下的PE文件: PE是Portable Execute的缩写,是可移植可执行的意思,只要文件的数据结构遵循PE结构,就属于PE文件,windows中常见的PE文件有 *.sys驱动类文件 *.dll动态链接库文件 *.exe可执行文件 *.ocx对象类别扩充组建 *.obj目标文件等. 同样,linux中使用的是ELF格式,和windows的PE格式有一定的差别,如: 可重定位文件*.o 可执行文件如/bin/ls等 共享目标文件*.so 核心转储文件core 都遵循ELF数据

cocos2dx c++ 在mac下写的中文注释,在win32下编译时不通过

今天遇到个奇怪的问题,在mac下写的程序,加的中文注释,编译没有问题,但是在win32下(使用的时vs2012, win7 64bit 系统)编译就总是报错 最后在中文注释后 加一个空格,或者 换行,就可以了,真心不能理解为啥-------- 问题截图: 问题解决截图: 求大神来解释解释其原因

Win32下双缓冲绘图技术

一:双缓冲原理 为了解决窗口刷新频率过快所带来的闪烁问题,利用双缓冲技术进行绘图.所谓双缓冲技术,就是将资源加载到内存,然后复制内存数据到设备DC(这个比较快),避免了直接在设备DC上绘图(这个比较慢).打个简单的比方:有个画家在街边办了一个即时画展,在同一块画布上根据观众的要求画不同的图像,每当有一位观众制定要看什么画时,画家先把之前画布上的东西全部擦干净,再重新绘画.显然有一些经典的画像是大家都想看的,按照以前的老办法,画家每次都要重新画这幅图像,但这种擦了画,画了擦的方式很费时.所以画家想

win32下PE文件分析之NT头

接上一篇的win32下PE文件分析之DOS头 (一)win32中PE的NT: NT头是PE文件中标准PE头和可选PE头的总体称谓,还包含一个PE标识.下面是它在Visual C++ 6.0中WINNT.h中的定义: typedef struct _IMAGE_NT_HEADERS64 {     DWORD Signature;     IMAGE_FILE_HEADER FileHeader;     IMAGE_OPTIONAL_HEADER64 OptionalHeader; } IMAG

win32下开发hadoop

转载自:http://my.oschina.net/muou/blog/408543[木偶:Windows下使用Hadoop2.6.0-ecli­p­s­e­-­p­­lugin插件] 对于一些细节地方,我进行了补充. 一.简介 Hadoop2.x之后没有Eclipse插件工具,我们就不能在Eclipse上调试代码,我们要把写好的java代码的MapReduce打包成jar然后在Linux上运行,所以这种不方便我们调试代码,所以我们自己编译一个Eclipse插件,方便我们在我们本地上调试,经过h

改良cocos2dx Win32下的内存占用

猜测它有可能是在主循环里使用了 Sleep(0), 一搜,果然定位到具体代码,它位于 cocos2dx\platform\win32\CCApplication.cpp,大致长像如下: 1 while( 1 ) { 2 if( 有消息 ) { 3 if( 时间到 ) 更新计时, call 主循环函数; 4 else Sleep(0); 5 } 6 // 其他跳出循环判断代码 7 } 也就是说,该循环除了执行 mainLoop 以外,花了大量时间在 检查消息和 Sleep(0) 上面. 并且,我还

win32下进程间通信——共享内存

一.引言     在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换.    进程间通讯(即:同机通讯)和数据交换有多种方式:消息.共享内存.匿名(命名)管道.邮槽.Windows套接字等多种技术.“共享内存”(shared memory)可以定义为对一个以上的进程是可见的内存或存在于多个进程的虚拟地址空间.例如:如果两个进程使用相同的DLL,只把DLL的代码页装入