介绍:

Layered Windows是windows窗口中的一类,提供类似半透明的效果(阿尔法混合)。半透明效果是字面上有能看出来的,但实际上根据MSND,该类型的窗口还能更好的支持非矩形的窗口,使之显示效果更平滑流畅(暗地里猜测是使用了硬件加速而达到的效果)。在win8之前WS_EX_LAYERED只能用于顶层窗口,win8及之后版本子窗口也可以使用。

使用:

首先要做的就是在CreateWindowEx()时加入 WS_EX_LAYERED风格。之后调用SetLayeredWindowAttributes()。该函数原型如下:

  

BOOL WINAPI SetLayeredWindowAttributes(
_In_ HWND hwnd,      //窗口句柄
_In_ COLORREF crKey,      //设置色彩通道的相对分量 使用RGB宏
_In_ BYTE bAlpha,     //阿尔法值,0-225之间
_In_ DWORD dwFlags     //LWA_ALPHA或LWA_COLORKEY,或二者都有
);
/*
*LWA_ALPHA :使用阿尔法值显示透明效果
LWA_COLORKEY:使用RGB通道过滤颜色
*/

那么两种Flag有什么区别呢,或者说它们分别是什么效果呢?不多说上图就明白了。

LWA_COLORKEY有效时参数指定的    LWA_ALPHA 有效时对窗口整体使用半

颜色被视为透明                 透明效果,阿尔法值由参数指定。 

                 

左侧是LWA_COLORKEY,可以看到在窗口    右侧是 LWA_ALPHA可以看到整体呈现半透明,而且

上画的RGB=(255,0,255)的圆形被视    在窗口上绘制的圆形也是半透明的。(也注意到对圆型

为透明                     窗口其坐标还是按矩形的左上角算的) 

两种效果可以同时使用效果,其效果就是一个半透明的黑色月亮。

可以使用UpdataLayeredWindow()函数更新Layered Window。比如重新设置其透明度,位置,大小,形状等。该函数会更新整个窗口。不需要担心被遮挡的窗口的更新问题,系统会处理好的。(对一个Layered窗口系统总是保存其下面的图像,并自动更新,这意味着占用更多内存,所以不需要时通过SetWindowLong()删除WS_LAYERED风格。这在下面还会说)

对透明的部分(比如上面左图月牙缺掉的部分或者对右图设置阿尔法值为0)点击鼠标时,鼠标消息会透过窗口,也就是Layered窗口在此处不接受鼠标消息。这很符合所看即所得的设计理念,用户感觉看不到的地方就是没有,他们不必理解什么阿尔法混合。

如何设置Layered窗口为普通的窗口

如果不再需要透明效果,尽早去掉Layered属性可以提高性能,标准的做法如下:

// Remove WS_EX_LAYERED from this window styles
SetWindowLong(hwnd,
GWL_EXSTYLE,
GetWindowLong(hwnd, GWL_EXSTYLE) & ~WS_EX_LAYERED); // Ask the window and its children to repaint
RedrawWindow(hwnd,
NULL,
NULL,
RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);

最后说一点,如果窗口已经创建好了也有其他的办法,调用SetWindowLong(),重新设置窗口风格即可。但是对一个已经显示在屏幕上的窗口修改其风格为 WS_EX_LAYERED时会发现该窗口不见了,此时调用UpdataLayeredWindow()或SetLayeredWindowAttributes()后会出现你想要的样子。

另外:一旦 SetLayeredWindowAttributes 被调用了, 之后对 UpdateLayeredWindow 的调用都会失败直到重新改变了窗口的Layered属性。

最新文章

  1. Jquery中的Ajax
  2. 海量数据相似度计算之simhash短文本查找
  3. iOS开发小技巧--利用运行时得到隐藏的成员变量
  4. C++之路起航——标准模板库(vector)
  5. [Linux 命令]df -h
  6. Redis 字符串(String)
  7. 【Linux】常用命令
  8. iOSiOS开发之退出功能(易错)
  9. POJ1743 Musical Theme(二分+后缀数组)
  10. Unity3D 热更新方案总结
  11. 关于py的思考
  12. LINQ to Entities 不识别方法“System.DateTime AddDays(Double)
  13. bootstrap 常用class
  14. 解释局域(LAN)和广域网(WAN)之间的区别,它们之间的关系是什么?
  15. 给电脑C盘系统盘瘦身的四种方法
  16. 如何在VMware8虚拟机里安装Xp GHOST系统 解决不能启动Xp系统方法
  17. Java知识回顾 (6)正则表达式、方法、文件与异常
  18. Math.log()对数的妙用
  19. mysql 直接拷贝data 目录下文件用不的解决方案
  20. 真验货客户尾缀sql

热门文章

  1. IIS环境下部署项目
  2. Kruskal和Prim算法求最小生成树
  3. jDialects:一个从Hibernate抽取的支持70多种数据库方言的原生SQL分页工具
  4. 第一次在gitHub上传项目到git.oschina的方法
  5. dp
  6. 学习笔记:javascript 文档对象(document)
  7. [笔记]我的Linux入门之路 - 04.Eclipse安装
  8. springcloud(二):注册中心Eureka
  9. 腾讯IVWEB团队:前端 fetch 通信
  10. 项目自动构建工具对比(Maven、Gradle、Ant)