亚克力效果的实现思路

上一篇博客《如何在pyqt中实现窗口磨砂效果》 中实现了win7中的Aero效果,但是和win10的亚克力效果相比,Aero还是差了点内味。所以今天早上又在网上搜了一圈,无意中发现了这篇博客《使用 SetWindowCompositionAttribute 来控制程序的窗口边框和背景》,点进去认真看了一遍之后深受启发,于是又去改了一下上次实现Aero效果时所用的函数,重新编译为dll给python调用,需要注意的是,要想成功使用编译好的dll必须在Visual Studio里面装好C++,如果不想装的话可以参见《如何在pyqt中通过调用SetWindowCompositionAttribute实现Win10亚克力效果》,这里面用纯Python的方法实现了亚克力效果。

具体实现流程

  1. WindowCompositionAttribute.h 的枚举类 ACCENT_STATE 中新增一个ACCENT_ENABLE_ACRYLICBLURBEHIND 参数,初值为4;
  2. 定义setBlur()函数的时候,ACCENT_POLICY accent = { ACCENT_ENABLE_ACRYLICBLURBEHIND, 0, gradientColor, 0 },和上次相比列表的第一个参数变成了 ACCENT_ENABLE_ACRYLICBLURBEHIND,第三个参数由0变为了gradientColor,这个参数用来设置窗口的背景色;
  3. 在VS2019里面把写好的函数编译为 acrylic.dll
  4. 在python中通过 hWnd=ctypes.wintypes.HWND(int(self.winId())),把WId类型强制转换为HWND类型,接着设置背景色 gradientColor = DWORD(0x50F2F2F2)0x50F2F2F2 的前两位是透明度,后面六位是bgr,最后 ctypes.cdll.LoadLibrary('acrylic_dll\\acrylic.dll').setBlur(hWnd,gradientColor),实现动态链接库的载入和接口函数的调用,源代码如下:
import sys

from ctypes import cdll
from ctypes.wintypes import HWND, DWORD from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget class Demo(QWidget):
""" 亚克力效果的实现 """ def __init__(self):
super().__init__() self.resize(500, 500)
# 去除边框,没有这一步的话窗口阴影也会加上亚克力效果
self.setWindowFlags(Qt.FramelessWindowHint)
# 背景透明
self.setAttribute(Qt.WA_TranslucentBackground) # 调用api
hWnd = HWND(int(self.winId())) # 直接HWND(self.winId())会报错
gradientColor = DWORD(0x50F2F2F2) # 设置和亚克力效果相叠加的背景颜色
cdll.LoadLibrary('acrylic_dll\\acrylic.dll').setBlur(hWnd, gradientColor) if __name__ == "__main__":
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())

运行效果如下(硝子依旧如此美丽٩(๑>◡<๑)۶)

源代码以及dll

百度网盘(提取码:2la9):链接

如何在pyqt中实现win10亚克力效果的更多相关文章

  1. 如何在pyqt中实现窗口磨砂效果

    磨砂效果的实现思路 这两周一直在思考怎么在pyqt上实现窗口磨砂效果,网上搜了一圈,全都是 C++ 的实现方法.正好今天查python的官方文档的时候看到了 ctypes 里面的 HWND,想想倒不如 ...

  2. 如何在pyqt中通过调用 SetWindowCompositionAttribute 实现Win10亚克力效果

    亚克力效果 在<如何在pyqt中实现窗口磨砂效果>和<如何在pyqt中实现win10亚克力效果>中,我们调用C++ dll来实现窗口效果,这种方法要求电脑上必须装有MSVC.V ...

  3. 如何在pyqt中自定义无边框窗口

    前言 之前写过很多关于无边框窗口并给窗口添加特效的博客,按照时间线罗列如下: 如何在pyqt中实现窗口磨砂效果 如何在pyqt中实现win10亚克力效果 如何在pyqt中通过调用SetWindowCo ...

  4. 如何在pyqt中实现带动画的动态QMenu

    弹出菜单的视觉效果 QLineEdit 原生的菜单弹出效果十分生硬,而且样式很丑.所以照着Groove中单行输入框弹出菜单的样式和动画效果写了一个可以实现动态变化Item的弹出菜单,根据剪贴板的内容是 ...

  5. 如何在pyqt中在实现无边框窗口的同时保留Windows窗口动画效果(一)

    无边框窗体的实现思路 在pyqt中只要 self.setWindowFlags(Qt.FramelessWindowHint) 就可以实现边框的去除,但是没了标题栏也意味着窗口大小无法改变.窗口无法拖 ...

  6. 如何在pyqt中给无边框窗口添加DWM环绕阴影

    前言 在之前的博客<如何在pyqt中通过调用SetWindowCompositionAttribute实现Win10亚克力效果>中,我们实现了窗口的亚克力效果,同时也用SetWindowC ...

  7. 如何在 pyqt 中捕获并处理 Alt+F4 快捷键

    前言 如果在 Windows 系统的任意一个窗口中按下 Alt+F4,默认行为是关闭窗口(或者最小化到托盘).对于使用了亚克力效果的窗口,使用 Alt+F4 最小化到托盘,再次弹出窗口的时候可能出现亚 ...

  8. 如何在pyqt中实现亚克力磨砂效果的QLabel

    前言 Windows10 在 UWP 应用中支持亚克力画刷,可以在部件的底部绘制亚克力效果的背景图.下面我们使用 QLabel 来模拟这个磨砂过程. 实现方法 MSDN 文档中介绍了亚克力材料的配方, ...

  9. 如何在pyqt中使用 QGraphicsView 实现图片查看器

    前言 在 PyQt 中可以使用很多方式实现照片查看器,最朴素的做法就是重写 QWidget 的 paintEvent().mouseMoveEvent 等事件,但是如果要在图像上多添加一些形状,那么在 ...

随机推荐

  1. 慢 SQL 优化

    # 导致SQL执行慢的原因 1. 硬件问题.如网络速度慢,内存不足,I/O吞吐量小,磁盘空间满了等. 2. 没有索引或者索引失效.(一般在互联网公司,DBA会在半夜把表锁了,重新建立一遍索引,因为当你 ...

  2. CS229 机器学习课程复习材料-线性代数

    本文是斯坦福大学CS 229机器学习课程的基础材料,原始文件下载 原文作者:Zico Kolter,修改:Chuong Do, Tengyu Ma 翻译:黄海广 备注:请关注github的更新,线性代 ...

  3. 网络划分和各层协议以及webservice 浅谈

    最近在公司做一些和其他外部系统接口调用的工作,遇到一些网络传输的问题,趁周末的时间记录.整理一下. 提到网络我们不得不提网络的分层架构: 我们通常听到 网络七层架构/五层架构/四层架构,但是不了解很容 ...

  4. 更便捷的Mybatis增强插件——EasyMybatis

    easy-mybatis是一个对Mybatis的增强框架(插件).在Spring集成Mybatis的基础上,将项目开发中对数据库的常用操作统一化.使用本框架可以很便捷的对数据库进行操作,提高开发效率, ...

  5. Sentry 企业级数据安全解决方案 - Relay 配置选项

    Relay 的配置记录在文件 .relay/config.yml 中.要更改此位置,请将 --config 选项传递给任何 Relay 命令: ❯ ./relay run --config /path ...

  6. centos7 alias别名永久生效

    进入/etc/profile.d/目录 cd /etc/profile.d/ 在profile.d目录随意创建一个sh文件,例如alias_test.sh vi alias_test.sh##里面的内 ...

  7. 【Java常用类】String

    文章目录 String String实例化的方式 方式一:通过字面量定义 方式二:new + 构造器的方式 String s = new String("abc")方式创建对象,在 ...

  8. WEB开发的相关知识(Tomcat)

    Internet上供外界访问的Web资源分为 静态web资源(如html 页面):指web页面中供人们浏览的数据始终是不变. 动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访 ...

  9. day 16 int *p; scanf("%d",p);问题

    (1).以下不能用于描述算法的是[A] (A).E-R图 (B).伪代码 (C).计算机语言 (D).流程图 分析:E-R图也称实体-联系图,提供了表示实体类型.属性和联系的方法,用来描述现实世界的概 ...

  10. 《剑指offer》面试题35. 复杂链表的复制

    问题描述 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null. ...