介绍:

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属性。

Layered Windows窗口的半透明效果的更多相关文章

  1. 用了WS_EX_LAYERED 后所有Twincontrl的wm_paint消息会停止(官方Layered Windows文档很多内容)good

    fmx 和 vcl 不一样, fmx 的阴影可以通过2D显示出来. VCL 无标题栏窗口的阴影很麻烦 280425268 我也是用两个窗口做阴影,并重绘了非客户区,不过阴影是基础自TwinContro ...

  2. 如何在pyqt中在实现无边框窗口的同时保留Windows窗口动画效果(一)

    无边框窗体的实现思路 在pyqt中只要 self.setWindowFlags(Qt.FramelessWindowHint) 就可以实现边框的去除,但是没了标题栏也意味着窗口大小无法改变.窗口无法拖 ...

  3. 【转】Windows 窗口层次关系

    原文链接:undefined! 相信在Windows 下面编程的很多兄弟们都不是很清楚Windows 中窗口的层次关系是怎么样的,这个东西很久已经研究过一下,后来又忘记了,今天又一次遇到了这个问题,所 ...

  4. 在WPF控件上添加Windows窗口式调整大小行为

    起因 项目上需要对Canvas中的控件添加调整大小功能,即能在控件的四个角和四条边上可进行相应的拖动,类似Windows窗口那种.于是在参考以前同事写的代码基础上,完成了该功能. 代码实现 Adorn ...

  5. 按键精灵 句柄 获得句柄 控制windows窗口 后台

    新建一个文本文档,打开,Windows就会给这个文本文档的窗口临时分配唯一的一串数字来标识这个窗体,以区别于其他窗口,这串数字就叫句柄.   因为句柄是临时随机分配的,所以每次虽然是打开同一个文件,但 ...

  6. VC菜菜鸟:建立第一个基于Visual C++的Windows窗口程序

    建立第一个基于VisualC++的Windows窗口程序: 发表于:http://blog.csdn.net/it1988888/article/details/10306585 a)执行命令:新建 ...

  7. Activity透明/半透明效果的设置transparent(两种实现方法)

    两种方法实现Activity透明/半透明效果的设置,代码思路很有调理,感兴趣的朋友可以参考下,希望本文可以帮助到你   方法一:res/values文件夹下建立styles.xml: 复制代码代码如下 ...

  8. 设置windows窗口ICON 【windows 编程】【API】【原创】

    1. ICON介绍 最近开始接触windows 编程,因此将自己所接触的一些零散的知识进行整理并记录.本文主要介绍了如何更改windows对话框窗口的ICON图标.这里首先介绍一下windows IC ...

  9. PostMessage 向Windows窗口发送Alt组合键

    PostMessage 向Windows窗口发送Alt组合键 关于向Windows窗口发送Alt组合键的问题,这个真是经典问题啊,在网上找了一下,问的人N多,方法差不多, 但就是没有很好解决问题. 之 ...

随机推荐

  1. 2017-4-24 WinForm开发基础、窗体的属性CenterScreen

    WinForm中文名称: Windows窗体,是·Net开发平台中对Windows Form的一种称谓. 客户端应用程序:C/S 客户端很重要的特点:可以操作用户电脑上的文件 窗体属性:窗体种类: + ...

  2. ECharts 实现人民的名义关系图谱 代码开源

    1.什么是ECharts ECharts是百度开源的纯 Javascript 图表库,目前开源可以与highcharts相匹敌的一个图表库,相信有很多国内用户使用. 官网 http://echarts ...

  3. stl_泛型的一些基本

    一.泛型编程的一些基本 : 1.泛型程序设计: 1.1.程序尽可能的通用. 1.2.将算法从数据结构中抽象出来,成为通用. 1.3.模板并不是单纯的函数,不能凭空的生成,是用来产生代码的代码,可以减少 ...

  4. 【算法系列学习】codeforces C. Mike and gcd problem

    C. Mike and gcd problem http://www.cnblogs.com/BBBob/p/6746721.html #include<iostream> #includ ...

  5. Stimulsoft报表操作笔记(一):统计

    一.引言 报表大家应该都知道是什么,简单来说就是用表格.图表等格式来动态显示数据.现在web系统中很多需要使用到报表统计.打印功能等,将所需用到的数据绑定到指定的位置,然后分类汇总,这样查看起来更清晰 ...

  6. Linux学习之要点必备

    在本节课中我将会带领大家秒懂linux命令 要点一:常见基本命令格式 命令名称+选项+参数 例如:#mkdir -r /var/ruofeng/001/ 我们通过逐级创建目录方式解释这个例子,mkdi ...

  7. C++学习 cout的格式化输出

    cout的格式化输出 1.常用: ①double 输出到小数点后n位:(保留精度 n位) #include <iostream> #include <iomanip> usin ...

  8. 【2017-05-05】timer控件、三级联动、帐号激活权限设置

    一.Timer控件 Timer实际就是一个线程控件. 属性:Enabled    是否被启用 Interval     多长时间执行一次控件中的代码 事件: Tick     事件中放要执行的代码. ...

  9. 解决ssh或ftp下root用户认证失败问题

    问题:当连接ssh远程终端或使用ftp方式进行文件传输时,使用普通用户可以进行远程登录,但使用root用户则认证失败,提示密码错误.而我们在普通用户登录下,su - root,验证密码,是可以正常切换 ...

  10. STM32采集电阻触摸贴膜

    今天为了解决一个测量电阻屏压力的问题,自己直接用STM32做了一个测量电阻屏的程序(直接把触摸屏的四根线接到单片机引脚上),通过AD切换采集,采集X轴电压,Y轴电压,和压力..最后附上自己的程序 先说 ...