如何在pyqt中实现win10亚克力效果
2023-02-18 16:32:01 时间
亚克力效果的实现思路
上一篇博客《如何在pyqt中实现窗口磨砂效果》 中实现了win7中的Aero效果,但是和win10的亚克力效果相比,Aero还是差了点内味。所以今天早上又在网上搜了一圈,无意中发现了这篇博客《使用 SetWindowCompositionAttribute 来控制程序的窗口边框和背景》,点进去认真看了一遍之后深受启发,于是又去改了一下上次实现Aero效果时所用的函数,重新编译为dll给python调用,需要注意的是,要想成功使用编译好的dll必须在Visual Studio里面装好C++,如果不想装的话可以参见《如何在pyqt中通过调用SetWindowCompositionAttribute实现Win10亚克力效果》,这里面用纯Python的方法实现了亚克力效果。
具体实现流程
- 在
WindowCompositionAttribute.h
的枚举类ACCENT_STATE
中新增一个ACCENT_ENABLE_ACRYLICBLURBEHIND
参数,初值为4; - 定义setBlur()函数的时候,
ACCENT_POLICY accent = { ACCENT_ENABLE_ACRYLICBLURBEHIND, 0, gradientColor, 0 }
,和上次相比列表的第一个参数变成了ACCENT_ENABLE_ACRYLICBLURBEHIND
,第三个参数由0变为了gradientColor
,这个参数用来设置窗口的背景色; - 在VS2019里面把写好的函数编译为
acrylic.dll
; - 在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_())
运行效果如下(硝子依旧如此美丽٩(๑>◡<๑)۶)
![](https://img-blog.csdnimg.cn/20200615141422893.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poaXlpWW8=,size_16,color_FFFFFF,t_70#pic_center)
源代码以及dll
百度网盘(提取码:2la9):链接
相关文章
- 使用Commons Logging
- 记一次 .NET 某自动化采集软件 崩溃分析
- [C# 中的序列化与反序列化](.NET 源码学习)
- .NET 向量类型的运算结果范例——用于学习Vector类所提供百多个向量方法
- 树莓派(香橙派)通过.NET IoT 操作SPI编写屏幕驱动 顺手做个四足机器人(一)
- WPF自定义控件之消息提示
- .NET跨平台框架选择之一 - Avalonia UI
- 篇(16)-Asp.Net Core入门实战-权限管理之用户创建与关联角色(ViewModel再用与模型验证二)
- 学习ASP.NET Core Blazor编程系列十——路由(下)
- 代码生成器(CodeBuilder) 2.9.4 稳定版
- 篇(15)-入门实战-权限管理之用户创建与关联角色(ViewModel再用与模型验证一)
- 篇(14)-Asp.Net Core入门实战-权限管理之角色编辑和赋权(ViewModel-DTO初探)
- 算法-2 选择排序、冒泡排序、插入排序
- 篇(13)-Asp.Net Core入门实战-将功能代码增加异步功能Async和配置简单防范CSRF攻击
- NET 6 实现滑动验证码(一)、创建工程
- 算法-1 算法复杂度
- 在WPF中使用Prism弹出自定义窗体样式的对话框
- 使用Fody时,CS-SCRIPT动态代码无法找到程序集
- C# 使用SIMD向量类型加速浮点数组求和运算(3):循环展开
- aspnetcore两种上传图片(文件)的方式