窗口模糊与透明

最近敲个类似与游戏背包的界面,我想要求它半透明等等。

这就将我发现的记录下来。

首先透明可以用:

1、DWM模糊化(但是这个似乎只是模糊)。

MARGINS结构、DwmExtendFrameIntoClientArea函数、

DWM_BLURBEHIND、DwmEnableBlurBehindWindow函数

2、使用窗口扩展样式 WS_EX_LAYERED (也就是分层窗口,MSDN上说win8以后可以在子窗口使用,但是使用下来,我没弄出来  建议在顶层窗口使用)

SetLayeredWindowAttributes函数可以设置透明度 

3、这两个可以混用(也许是我的错觉)

我的窗口是标题写着显示游戏道具的这个窗口

先说2吧,这个简单点:

先将扩展窗口样式修改为分层窗口样式(WS_EX_LAYRED)

 再使用 SetLayeredWindowAttributes 函数 设置透明色 红色 RGB (255,0,0)   透明度 255*80/100(也就是80%透明度)        标志 LWA_ALPHA

我们来看看MSDN上怎么说这个函数的:

 

 

我们可以看到标志位 LWA_ALPHA是透明的关键

 

 不透明了( 两个标志可以或运算一起用的 ),那么这个另一个标志有什么用呢?很有意思的一点

前面我们设置了 RGB(255,0,0)  红色 (第二个参数)

现在我们画一个红色的矩形(先将标志设置为 LWA_ALPHA)

 

这里我就直接拦截了 WM_PAINT消息        简单创建了一个红色的笔刷        设置了LWA_ALPHA

红色矩形也是透明的。

现在设置        LWA_ALPHA|LWA_COLORKEY 

 直接挖掉了之前拿红色笔刷画的矩形       

还有更有意思的是鼠标可以透过这个矩形操作下面的窗口(好像有点错误  我再回去看看)

2023/5/3 10:00 星期三 补充更新

还有更有意思的是鼠标可以透过        操作下面的窗口     需要透明度颜色指定为创建窗口类时注册的背景颜色  如我设置的  RGB(255, 0, 255)

 为设置透明之前

 设置透明之后

 

 窗口背景整个挖掉了   然后可以透过这个被挖掉的地方(激活)操作下面的窗口  但是这样它就会失活而被覆盖  可以使用窗口顶置  直接操作下方窗口  setwindowpos

 

 设置顶置时的效果  很抱歉我还不会用动图

 但是这样窗口似乎会出现没法调整的情况,DIY视界就好不要要求太多

第一种DWM的可以窗口标题栏给模糊化,使用或运算的方式  也就是说如果是黑色那就全透明

 透明化也许两种方法都是与窗口下方像素进行或运算

终于到DWMl模糊化了  相信大家早已注意到我的另一个界面

 这个按钮绘制到黑色框框外面去了  看似似乎绘制超出了窗口的客户区(实际上也的确超出了,绘制在窗口框架上的  现在这个情况是把窗口的客户区延展覆盖了整个窗口也就是连窗口标题栏都变成客户区了)。

方法是怎么实现的呢?

拦截了 WM_NCPAINT  返回 0

WM_NCACTIVATE  返回  -1

WM_NCHITTEST  这个是弄点击测试的  MSDN上有教

WM_NCCALCSIZE 返回 0   这个是将客户区扩展到整个窗口  覆盖掉标题栏

WM_ACTIVATE里面调用下面两个 也许可以换位置  只有调用了就行

MARGINS结构   定义应用视觉样式的窗口的边距  其实就是  默认窗口框架(非客户区) 上下左右  其实就是边框大小  注意似乎是向里延伸展的

DwmExtendFrameIntoClientArea函数  

MSDN就不带着大家看了

 

 注意是毛玻璃效果

上代码

 我们使用了灰色笔刷的窗口背景

 灰色效果

 黑色效果

 白色效果

 

 完全没有透明  所以应该就是类似或运算  分层窗口有点或运算  但是不完全准确 具体是什么我也不知道

实现

上代码

 MARGINS结构控制的就是箭头指示的部分

 我是在WM_ACTIVATE消息里

其他消息处理

 

 

 这样设置就可以了

MARGINS结构  全部调成  -1  使其整个窗口透明化

 

 这个很有亚克力板的感觉吧

有些人提问了,那么我只让默认客户区透明而窗口非客户区不透明呢?

这个也有方法

DWM_BLURBEHIND结构

DwmEnableBlurBehindWindow函数

这个我没怎么研究过  就直接上代码了

 

 这个要把上面的所以消息默认返回值

注意DwmEnableBlurBehindWindow函数是 使绘制客户区 变得透明  客户区 记不记得上面有个消息返回 0 是将客户区扩充到整个窗口

好了下更2023/5/3 12:17

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值