使用vc++创建windows透明窗口

使用vc++创建windows透明窗口

windows下的透明窗口有不少的实现方法,最简单的当属空画刷啦,但是这篇文章将的是用layer window(分层窗口)来实现透明窗口。
见过vista/win7中窗口漂亮的半透明特效吗?用layer window可以轻松实现,而且其实layer window在古老的windows2000中就已经实现啦。基本不用考虑平台的问题。

layer window其实就是拥有WS_EX_LAYERED风格的窗口,layer window有两种创建方法,先天的、后天的。

先天的就是指创建时就指定WS_EX_LAYERED风格。只要在CreateWindowEx函数中的第一个参数中加上WS_EX_LAYERED即可。
后天的就是指创建完窗口再加入WS_EX_LAYERED风格。

LONG nRet = ::GetWindowLong(hwnd, GWL_EXSTYLE); nRet = nRet | WS_EX_LAYERED; ::SetWindowLong((hwnd, , GWL_EXSTYLE, nRet);

添加完WS_EX_LAYERED风格后还不能立刻就有效果,还要设置一些透明参数才能生效。
设置透明效果有两个函数,SetLayeredWindowAttributesUpdateLayeredWindow,通常使用前一个就够了。
SetLayeredWindowAttributes函数用来设置窗口的透明参数,第一个参数是窗口句柄,第二个是关键色,至于什么是关键色,后面会讲,第三个是透明度,第四个是透明方式。
SetLayeredWindowAttributes可以设置两种透明渲染模式,关键色透明和透明度,选择那种方式取决于第四个参数。
1. LWA_COLORKEY代表使用关键透明色来渲染,此时第二个参数会起作用,第二个参数是一个rgb颜色值,可以通过RGB宏生成,当设置了此模式时,此窗口上所有和这个关键颜色值相同的地方会变透明。同时注意,透明的地方无法被鼠标点击,鼠标会直接点击透明窗口下面的地方。
2. LWA_ALPHA代表使用整体透明度来渲染,此时第三个参数会起作用。第三个参数是一个字节的整数,0~255表示透明度,0完全透明,255不透明。用这种方式可以做出win7的玻璃半透明效果,注意窗口的所有地方都会透明,包含标题栏,当时我初学的时候,设了透明度为1,半天没找到窗口在哪,以为代码写错了。不过窗口是可以被鼠标点击的。
3还有一种方式就是LWA_ALPHA|LWA_COLORKEY,两种的特性都会有。
这就是透明参数的基本设置,还有一些复杂的设置可以使用UpdateLayeredWindow函数,通常用于处理本身的会面中有透明通道的一些设置和对透明位置的一些控制。

    原文作者:太上绝情
    原文地址: https://blog.csdn.net/bjrxyz/article/details/54865169
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞