最近敲个类似与游戏背包的界面,我想要求它半透明等等。
这就将我发现的记录下来。
首先透明可以用:
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