窗口模糊与透明 | 您所在的位置:网站首页 › 唯美电脑壁纸女生动漫高清 › 窗口模糊与透明 |
最近敲个类似与游戏背包的界面,我想要求它半透明等等。 这就将我发现的记录下来。 首先透明可以用: 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 |
CopyRight 2018-2019 实验室设备网 版权所有 |