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

  1. #define WS_EX_LAYERED 0x00080000
  2. #define LWA_COLORKEY 0x00000001
  3. #define LWA_ALPHA 0x00000002
  4.  
  5. class CTransparent
  6. {
  7. public:
  8. static BOOL SetTransparentWnd(HWND hWnd, COLORREF crKey, UINT cAlpha, BOOL dwFlags);
  9. static BOOL FreeUser32DLL();
  10. static BOOL ChangeTransparency(HWND hWnd,COLORREF crKey, UINT bAlpha, DWORD dwFlags);
  11. static BOOL LoadUser32DLL();
  12.  
  13. static TRANFUNC m_pFunc;
  14. static HINSTANCE m_hInstance;
  15. static BOOL initialized;
  16.  
  17. };
  18.  
  19. HINSTANCE CTransparent::m_hInstance = NULL;
  20. TRANFUNC CTransparent::m_pFunc = NULL;
  21. BOOL CTransparent::initialized = FALSE;
  22. //////////////////////////////////////////////////////////////////////
  23. // Construction/Destruction
  24. //////////////////////////////////////////////////////////////////////
  25. BOOL CTransparent::LoadUser32DLL()
  26. {
  27. BOOL bRet = FALSE;
  28. if (!initialized)
  29. {
  30. m_hInstance = LoadLibrary(L"User32.DLL");
  31. if(m_hInstance )
  32. {
  33. //取得SetLayeredWindowAttributes函数指针
  34. m_pFunc=(TRANFUNC)GetProcAddress(m_hInstance, "SetLayeredWindowAttributes");
  35. if(m_pFunc != NULL)
  36. {
  37. initialized = TRUE;
  38. bRet = TRUE;
  39. }
  40. }
  41. }
  42. return bRet ;
  43. }
  44.  
  45. BOOL CTransparent::ChangeTransparency(HWND hWnd, COLORREF crKey, UINT bAlpha, DWORD dwFlags)
  46. {
  47. //透明度Sp的值是0-255
  48. //当中0为全然透明应该避免出现
  49. BOOL bRet = FALSE;
  50. if (m_pFunc == NULL)
  51. LoadUser32DLL();
  52.  
  53. if(m_pFunc != NULL)
  54. {
  55. m_pFunc(hWnd, crKey, bAlpha, dwFlags);
  56. bRet = TRUE;
  57. }
  58. return bRet;
  59. }
  60.  
  61. BOOL CTransparent::FreeUser32DLL()
  62. {
  63. if(m_hInstance != NULL)
  64. {
  65. FreeLibrary(m_hInstance);
  66. if(m_pFunc != NULL) //置空
  67. m_pFunc = NULL ;
  68. if(initialized != NULL) //置空
  69. initialized = NULL ;
  70. }
  71. return TRUE;
  72. }
  73.  
  74. BOOL CTransparent::SetTransparentWnd(HWND hWnd, COLORREF crKey, UINT cAlpha, BOOL dwFlags)
  75. {
  76. BOOL bRet = TRUE;
  77.  
  78. //要使使窗口拥有透明效果,首先要有WS_EX_LAYERED扩展属性 WS_EX_LAYERED = 0x80000
  79. //SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
  80. SetWindowLong(hWnd,
  81. GWL_EXSTYLE ,
  82. GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
  83.  
  84. if(dwFlags)
  85. {
  86. ChangeTransparency(hWnd, crKey, cAlpha, LWA_ALPHA); //设置cAlpha值0-255
  87. }
  88. else
  89. {
  90. ChangeTransparency(hWnd, crKey, cAlpha, LWA_COLORKEY); //crkey同样色变成透明
  91. }
  92.  
  93. return bRet;
  94. }

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

  1. HWND m_hMyWnd = ::CreateWindow(L"LoginWndDLL", L"TraWnd", WS_POPUP,
  2. (int)((xRes - m_WndWidth) / 2), (int)((yRes - m_WndHeight) / 2), m_WndWidth, m_WndHeight, 0, 0, hInst, 0);
  3. //在这里注冊一个窗体第三个參数表示窗体的类型
  4. CTransparent::SetTransparentWnd((HWND)m_hMyWnd, 0xffffff, 200, 2); //设置窗体透明
  5. ::ShowWindow(m_hMyWnd, SW_SHOW);

实际上上面这个类使用了动态调用user32.dll中的SetLayeredWindowAttributes函数,通过这个函数来实现窗体透明方式,这种方法与网上的大多数方法类似,只是是加了一个类进行了封装

win32下实现透明窗体的更多相关文章

  1. qt 获取windows 的消息(通过MFC的DLL的透明窗体转发消息)good

    qt 给win32 发送消息很简单,但是要获取windows 消息却十分复杂,最后想了一个不是很完美 但是也是以现在本人能力所能实现的唯一途径了,基本原理是 利用vc编写一个mfc 的dll ,这个d ...

  2. WPF透明窗体不支持缩放解决方案

    方案一 WPF中的无边框透明窗体,由于没有边并且透明,窗体无法进行缩放操作,今天来讲解如何解决这个问题. 先说一下思路,我们先手为该窗体添加4个边,4个角用于缩放操作,然后再为他们写事件,完成拖放操作 ...

  3. JavaFX之FXML+CSS创建窗体以及透明窗体添加阴影

    前言 开通博客园有一段日子了,一直没空也没想好该写点什么.最近正好在做一个桌面程序,初次接触JavaFX,体验下来确实比swing好用不少.索性便记记学习笔记吧,虽然FX好像挺没存在感,没人用的感觉. ...

  4. MVVM模式下弹出窗体

    原地址:http://www.cnblogs.com/yk250/p/5773425.html 在mvvm模式下弹出窗体,有使用接口模式传入参数new一个对象的,还有的是继承于一个window,然后在 ...

  5. IE6下Png透明最佳解决方案(推荐) Unit PNG Fix

    引自:http://www.yeeyan.org/articles/view/98510/67784 网络上解决IE6下Png透明解决方案有很多,例如 IE PNG Fix from TwinHeli ...

  6. (转)解决png图片在IE6下不透明的方法

    来源于:http://xzl52199.blog.163.com/blog/static/95206446201142174540220/ 一.传统的JavaScript方法 思路: 1.一个专门解决 ...

  7. cocos2dx c++ 在mac下写的中文凝视,在win32下编译时不通过

    今天遇到个奇怪的问题,在mac下写的程序,加的中文凝视,编译没有问题,可是在win32下(使用的时vs2012, win7 64bit 系统)编译就总是报错 最后在中文凝视后 加一个空格,或者 换行, ...

  8. win32下用VC扩展PHP全过程

    闲着无聊,打算开发一些PHP组件来玩玩,由于在家没有工作环境,遂打算在win32(我的环境是vista)用VC开发DLL模块,费话不 多说了,进入正题: 一.已经在机器上安装PHP环境的就略过,否则先 ...

  9. ie8下的透明 问题

    团队里经常遇到,索性整理一起 是我们在前端开发中经常遇到的,在问题中经常遇到的两个问题是背景色透明和整体透明 先说下背景色透明,背景色透明,在现代浏览器中,可以用rgba颜色作为背景色. 简单介绍下r ...

随机推荐

  1. 3ds Max怎么制作亮木材质的球体

    3DSMax怎么制作亮木材质的球体?3DSMax中想要设计一款亮木材质的球体,该怎么设置呢?下面我们就来看看详细的教程,需要的朋友可以参考下! 1.运行软件,选择材质编辑器图标: 3.双击拖拽出的材质 ...

  2. 理解ZBrush中的笔触

    笔触主要配合笔刷来使用,同样的笔刷搭配不同的笔触可以绘制出各种不同的效果.简言之,ZBrush 4R8就是提供了各种各样的笔触效果,例如,有模拟连贯笔触的效果,也有模拟喷枪喷洒的笔触效果. 下面简单认 ...

  3. LAMP环境搭建备忘 -- MariaDB 安装(三)

    因为 MySQL 的一些原因,在 Linux 平台上的开源数据库渐渐被 MariaDB 取代. MariaDB 安装命令如下图 安装成功后,接下来就启动这个数据库服务 我们还需要对数据库做一些初始化的 ...

  4. java String字符串操作 字符串加密等

    子串加密 1,设计思想 (1)输入一个字符串 (2)通过toCharArray()的方法将字符串转换成字符数组 (3)新建一个字符数组用来存储修改后的字符数组 2,程序流程图 3,源代码 packag ...

  5. 紫书 例题8-11 UVa 10954 (优先队列)

    解法和合并果子是一样的, 每次取最小的两个, 更新答案, 加入队列 #include<cstdio> #include<queue> #define REP(i, a, b) ...

  6. Maven项目的坐标GroupId和ArtifactId

    GroupId和ArtifactId被统称为“坐标”是为了保证项目唯一性而提出的,如果你要把你项目弄到maven本地仓库去,你想要找到你的项目就必须根据这两个id去查找.       GroupId一 ...

  7. Ask DevOps: Top 5 Business Alternatives to Splunk

    https://siliconangle.com/blog/2012/11/20/ask-devops-top-5-business-alternatives-to-splunk/

  8. 洛谷 P2960 [USACO09OCT]Milkweed的入侵Invasion of the Milkweed

    P2960 [USACO09OCT]Milkweed的入侵Invasion of the Milkweed 题目描述 Farmer John has always done his best to k ...

  9. HNU13377:Book Club(DFS)

    Problem description Porto's book club is buzzing with excitement for the annual book exchange event! ...

  10. Android sdk版本以及兼容性问题

    Android:minSdkVersion —— 此属性决定你的应用能兼容的最低的系统版本,一盘情况是必须设置此属性. android:targetSdkVersion —— 此属性说明你当前的应用是 ...