首发于我的个人博客:xie-kang.com

博客内有更多文章,欢迎大家访问

原文地址

前言:

很多人看到这个需求的第一想法都是录制软件窗口后的桌面内容,并且加上个高斯模糊就能实现了。

思路没有错,操作系统提供的API本质也是这样实现的。

但是我们软件是处于用户态的,怎么获取自己窗口背后的内容?当然也只能通过系统API实现!关键是如果你录制或者截图屏幕内容,在一些操作系统,比如macOS上系统会弹窗告知用户是否允许软件录制屏幕,这用户能接受吗?

所以说这么多,使用系统提供的API实现毛玻璃这个方式是最好的。

正文:

win7上可以使用DwmEnableBlurBehindWindow、win10上使用SetWindowCompositionAttribute(MSDN未公开的API)都可以实现毛玻璃的效果;

给Qt窗口设置上 setAttribute(Qt::WA_TranslucentBackground) 属性即可除去背景色将整个窗口透明。

在默认情况下使用SetWindowCompositionAttribute边框会有三条透明边在窗口的四周,因为该API实现的毛玻璃的过程是在窗口后创建了一个包括主窗口阴影的在内的辅助窗口在主窗口之后。

要除去这三条透明边可以使用 setWindowFlag(Qt::FramelessWindowHint) 创建一个无边框的窗口,效果如下:

但有时候出于实际的业务需求或者代码兼容问题我们需要保留窗口的边框,可以考虑以下方案:

1.主窗口使用

QtWin::enableBlurBehindWindow(this);
setAttribute(Qt::WA_TranslucentBackground);

实现带边框的背景透明窗口;

2.创建一个与主窗口宽高一致的Widget(或窗口),将其设置为无边框窗口以及毛玻璃效果,使其实时跟随主窗口的宽高以及大小并保持在主窗口之下;

 

注:Qt上可以使用QGraphicsBlurEffect实现控件的模糊效果,如果搭配上透明背景是否可以也实现毛玻璃效果呢?这个没有实践。

SetWindowCompositionAttribute使用示例代码:

struct WCAD
{
WindowCompositionAttribute Attribute;
int * Data;
int SizeOfData;
}; typedef int* (*pfun)(HWND hwnd, WCAD *data); HWND hWnd = HWND(winId());
HMODULE hUser = GetModuleHandle(L"user32.dll");
if (hUser) {
pfun setWindowCompositionAttribute = (pfun)GetProcAddress(hUser, "SetWindowCompositionAttribute");
if (setWindowCompositionAttribute) {
AccentPolicy accent = {3, 0, 0, 0};//ACCENT_ENABLE_BLURBEHIND 具体枚举参加MSDN
WCAD data;
data.Attribute = 19;//WCA_ACCENT_POLICY 具体枚举参加MSDN
data.Data = reinterpret_cast<int *>(&accent) ;
data.SizeOfData = sizeof(accent);
setWindowCompositionAttribute(hWnd, &data);
}
}

参考链接:

MSDN dwmapi: https://docs.microsoft.com/zh-cn/windows/win32/api/dwmapi/nf-dwmapi-dwmsetwindowattribute?redirectedfrom=MSDN

Qt 在win7上实现背景毛玻璃效果的音乐播放器: https://doc.qt.io/qt-5/qtwinextras-musicplayer-example.html

QGraphicsBlurEffect类说明: https://doc.qt.io/qt-5/qgraphicsblureffect.html

SetWindowCompositionAttribute 各设置的对比(c#): https://blog.csdn.net/wpwalter/article/details/103268596

Qt Windows上实现毛玻璃效果的更多相关文章

  1. 让Qt支持Win7的Aero和毛玻璃效果

    Qt5增加了许多特性,其中 Qt Windows Extras 模块就增加了对Win7 Aero 效果的支持. 官网的介绍如下: Qt Windows Extras provide classes a ...

  2. windows上的Qt 5的依赖部署打包

    通常我们编译Qt程序的时候最终会生成exe或dll,这些可执行文件都会有Qt模块的依赖,如果项目一旦庞大,就不是很好看出缺了什么模块,导致安装包安装到其他绿色干净的windows机器上会提示缺少XXX ...

  3. 【Qt开发】Qt Creator在Windows上的调试器安装与配置

    Qt Creator在Windows上的调试器安装与配置 如果安装Qt时使用的是Visual Studio的预编译版,那么很有可能就会缺少调试器(Debugger),而使用MSVC的Qt对应的原生调试 ...

  4. 普通键盘Windows上虚拟Cherry机械键盘效果的方法

    草台班子--普通键盘Windows上虚拟Cherry机械键盘效果的方法    ​ 机械键盘以其独特的手感.绚丽的外形,还有那人神共愤的音效吸引着大批爱好者.最近iQQO 3的机械键盘效果更是吸引了更多 ...

  5. Qt开发笔记:OpenSSL库介绍、windows上mingw32版本的OpenSSL编译模块化

    前言   Windows上mingw32版本的openssl的编译是属于比较棘手的,OpenSSL本身不提供支持..   OpenSSL 介绍   OpenSSL是一个开放源代码的软件库包,应用程序可 ...

  6. qt qml fuzzyPanel 毛玻璃效果

    毛玻璃效果,用qml来写代码真是简短,大爱qml:) [下载地址]http://download.csdn.net/detail/surfsky/8426641 [核心代码] Rectangle{ c ...

  7. Qt Windows下链接子系统与入口函数(终结版)(可同时存在main和WinMain函数)

    Qt Windows下链接子系统与入口函数(终结版) 转载自:http://blog.csdn.net/dbzhang800/article/details/6358996 能力所限,本讨论仅局限于M ...

  8. (转)Windows上使用CMake

    CMake简介 原文:http://blog.gclxry.com/use-cmake-on-windows/ 你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软 ...

  9. 使用CSS3制作导航条和毛玻璃效果

    导航条对于每一个Web前端攻城狮来说并不陌生,但是毛玻璃可能会相对陌生一些.简单的说,毛玻璃其实就是让图片或者背景使用相应的方法进行模糊处理.这种效果对用户来说是十分具有视觉冲击力的. 本次分享的主题 ...

  10. Swift 之模糊效果(毛玻璃效果,虚化效果)的实现

    前言: 之前项目中有用到过Objective-C的的模糊效果,感觉很是不错,而且iOS8之后官方SDK也直接提供了可以实现毛玻璃效果的三个类:UIBlurEffect.UIVibrancyEffect ...

随机推荐

  1. yzh 总线选讲

    分布式:通过总线,我们可以用"通信""消息"等视角,把各个模块拆成各个小状态机,每个小状态机互相之间独立,通过总线通信 集中式:通过一个大状态机生成所有控制信号 ...

  2. 访问远程服务-RPC 与 REST

    方法调用 所做的传递参数.传回结果都依赖于栈内存.所以Caller 调用者 Callee 被调用者应该同属一个进程,拥有相同的 栈内存, 进程间通信(Inter-Process Communicati ...

  3. 8个你可能不知道的令人震惊的 HTML 技巧

    程序员面试题库分享 1.前端面试题库 (面试必备)            推荐:★★★★★ 地址:前端面试题库 2.前端技术导航大全      推荐:★★★★★ 地址:前端技术导航大全 3.开发者颜色 ...

  4. JavaScript垃圾回收机制的了解

    对于js种的任意长度字符串,对象,数组是没有固定大小的,只有在分配存储时,解释器就会分配内存来存储这些数据.当js的解释器消耗完系统所有可用内存时,就会造成系统崩溃.因此js有着自己的一套垃圾回收机制 ...

  5. jenkins +docker+python接口自动化之jenkins拉取gitee上的代码(四)

    1.背景 1.经过我们前面几轮的安装测试,我们已经安装了jenkins容器,python3,以及运行我们python代码所需要的第三方库在requirements.txt文件下统一安装. 2.需求 我 ...

  6. 5G智慧灯杆系统在智慧街区的应用

    智慧化的路灯作为一个高度集成的项目,是智慧城市在城市公共空间的落地载体,是一个自上而下的体系,有外延.可扩展.能适配智慧城市的建设要求.在商业街开展智慧灯杆建设,同期开展5G应用技术试点,有利于商业街 ...

  7. iOS用runtime给一个类动态添加方法 ---class_addMethod

    先介绍下class_addMethod这个fangfa   /**   * Adds a new method to a class with a given name and implementat ...

  8. SQL-分组聚合

    -- 语法 select * |列名|表达式         -- 5 from 表名                         -- 1 where 条件                    ...

  9. 半成品 java 身份证校验

    public static Boolean is18Card(String idCard18) { //证件省份 HashMap<String, String> aCity = new H ...

  10. 高性能的StampedLock锁

    StampedLock 支持的三种锁模式: 1.ReadWriteLock 支持两种模式:一种是读锁,一种是写锁 2.StampedLock 支持三种模式,分别是:写锁.悲观读锁和乐观读 1)写锁.悲 ...