Layered Windows窗口的半透明效果
介绍:
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属性。
最新文章
- Jquery中的Ajax
- 海量数据相似度计算之simhash短文本查找
- iOS开发小技巧--利用运行时得到隐藏的成员变量
- C++之路起航——标准模板库(vector)
- [Linux 命令]df -h
- Redis 字符串(String)
- 【Linux】常用命令
- iOSiOS开发之退出功能(易错)
- POJ1743 Musical Theme(二分+后缀数组)
- Unity3D 热更新方案总结
- 关于py的思考
- LINQ to Entities 不识别方法“System.DateTime AddDays(Double)
- bootstrap 常用class
- 解释局域(LAN)和广域网(WAN)之间的区别,它们之间的关系是什么?
- 给电脑C盘系统盘瘦身的四种方法
- 如何在VMware8虚拟机里安装Xp GHOST系统 解决不能启动Xp系统方法
- Java知识回顾 (6)正则表达式、方法、文件与异常
- Math.log()对数的妙用
- mysql 直接拷贝data 目录下文件用不的解决方案
- 真验货客户尾缀sql
热门文章
- IIS环境下部署项目
- Kruskal和Prim算法求最小生成树
- jDialects:一个从Hibernate抽取的支持70多种数据库方言的原生SQL分页工具
- 第一次在gitHub上传项目到git.oschina的方法
- dp
- 学习笔记:javascript 文档对象(document)
- [笔记]我的Linux入门之路 - 04.Eclipse安装
- springcloud(二):注册中心Eureka
- 腾讯IVWEB团队:前端 fetch 通信
- 项目自动构建工具对比(Maven、Gradle、Ant)