原创内容,转载请声明。


今天看到了一些辅助工具的窗口总是会有个毛玻璃效果,我就很好奇如何用c++如何编写那种窗口,就查阅了会儿资料,然后封装了毛玻璃的窗口类,本文主要用于笔记以后方便自己看,如果对你有帮助,可以参考,只能给主窗口使用,控件请自行更改绘图事件处。

废话不多说,上源码:


需要用到的头文件:

#include <QWidget>
#include <QtWin>
/*QtWin头文件包含不了,可能是没有包含winextras模块,具体包含方法:pro文件中QT+=...后添加\winextras
*/
#include <qdialog.h>
#include <QGraphicsBlurEffect>
#include <QGraphicsPixmapItem>
#include <QPaintEvent>
#include <QPainter>
#include <QTimer>
#include <QDebug>
#include <QApplication>
#include <QDesktopWidget>
#include <QEvent>
#include <QMouseEvent>
#include <qscreen.h>
#include <QHBoxLayout>//水平
#include <QVBoxLayout>//垂直
#include <qspinbox.h>

aerowidget.h内容:
#ifndef AEROWIDGET_H
#define AEROWIDGET_H#include <QWidget>
#include <QWidget>
#include <QtWin>
#include <qdialog.h>
#include <QGraphicsBlurEffect>
#include <QGraphicsPixmapItem>
#include <QPaintEvent>
#include <QPainter>
#include <QTimer>
#include <QDebug>
#include <QApplication>
#include <QDesktopWidget>
#include <QEvent>
#include <QMouseEvent>
#include <qscreen.h>
#include <QHBoxLayout>//水平
#include <QVBoxLayout>//垂直
#include <qspinbox.h>class AeroWidget : public QWidget
{Q_OBJECT
public:QWidget* _parent;explicit AeroWidget(QWidget *parent = nullptr);
public:void setParent(QWidget* p);//设置父类void setAlpha(int v);//设置透明度void paintEvent(QPaintEvent *ev);//绘图时间,在此函数中搞毛玻璃背景QColor bgColor;
private slots:void valueChanged_Slot(int v);//更新透明度
};//重要
enum AccentState
{ACCENT_DISABLED = 0,ACCENT_ENABLE_GRADIENT = 1,ACCENT_ENABLE_TRANSPARENTGRADIENT = 2,ACCENT_ENABLE_BLURBEHIND = 3,ACCENT_INVALID_STATE = 4
};
struct AccentPolicy
{AccentState AccentState;int AccentFlags;int GradientColor;int AnimationId;
};
enum WindowCompositionAttribute
{WCA_UNDEFINED = 0,WCA_NCRENDERING_ENABLED = 1,WCA_NCRENDERING_POLICY = 2,WCA_TRANSITIONS_FORCEDISABLED = 3,WCA_ALLOW_NCPAINT = 4,WCA_CAPTION_BUTTON_BOUNDS = 5,WCA_NONCLIENT_RTL_LAYOUT = 6,WCA_FORCE_ICONIC_REPRESENTATION = 7,WCA_EXTENDED_FRAME_BOUNDS = 8,WCA_HAS_ICONIC_BITMAP = 9,WCA_THEME_ATTRIBUTES = 10,WCA_NCRENDERING_EXILED = 11,WCA_NCADORNMENTINFO = 12,WCA_EXCLUDED_FROM_LIVEPREVIEW = 13,WCA_VIDEO_OVERLAY_ACTIVE = 14,WCA_FORCE_ACTIVEWINDOW_APPEARANCE = 15,WCA_DISALLOW_PEEK = 16,WCA_CLOAK = 17,WCA_CLOAKED = 18,WCA_ACCENT_POLICY = 19,WCA_FREEZE_REPRESENTATION = 20,WCA_EVER_UNCLOAKED = 21,WCA_VISUAL_OWNER = 22,WCA_LAST = 23
};
struct WindowCompositionAttributeData
{WindowCompositionAttribute Attribute;int * Data;int SizeOfData;
};
typedef int* (*pfun)(HWND hwnd, WindowCompositionAttributeData *data);//下面的宏其实是为了方便写绘图事件处理窗口内的模糊的代码,
//使用方式为 AERO(主窗口指针(本类中的_parent),bgColor)
#define AERO(t,bgColor) static bool v = false;\
if (v) return;\
QPainter painter(t);\
painter.setRenderHint(QPainter::Antialiasing);\
painter.setPen(Qt::NoPen);\
painter.setBrush(bgColor);\
painter.drawRoundedRect(rect(), 0, 0);\
v = true;#endif // AEROWIDGET_H

aerowidget.cpp内容:

#include "aerowidget.h"AeroWidget::AeroWidget(QWidget *parent) : QWidget(parent)
{_parent = parent;HWND hWnd = HWND(parent->winId());HMODULE hUser = GetModuleHandle(L"user32.dll");if (hUser) {pfun setWindowCompositionAttribute = (pfun)GetProcAddress(hUser, "SetWindowCompositionAttribute");if (setWindowCompositionAttribute) {AccentPolicy accent = { ACCENT_ENABLE_BLURBEHIND,0, 0, 0 };WindowCompositionAttributeData data;data.Attribute = WCA_ACCENT_POLICY;data.Data = reinterpret_cast<int *>(&accent) ;data.SizeOfData = sizeof(accent);setWindowCompositionAttribute(hWnd, &data);/*setWindowCompositionAttribute一个官方文档里面没有记录上去的函数,具体上网百度去该函数在此处用于设置毛玻璃背景*/}}parent->setAttribute(Qt::WA_TranslucentBackground);//设置窗口背景透明bgColor = QColor(255, 255, 255, 100);
}
//当毛玻璃的透明程度变化时就可以用下面的一个slot和一个函数来更新
void AeroWidget::valueChanged_Slot(int v)
{bgColor.setAlpha(v);//设置透明度this->update();//更新
}
void AeroWidget::setAlpha(int v)
{bgColor.setAlpha(v);//设置透明度this->update();//更新
}
void AeroWidget::paintEvent(QPaintEvent *ev)
{AERO(this->_parent,this->bgColor);//更新透明毛玻璃背景
}

All in all,以上就是封装最简单的一个毛玻璃窗口类

他的使用也十分简单:

//在主窗口的构造函数中使用,老样子和其他控件一样
AeroWidget 毛玻璃窗口对象(this);
/*记住,因为毛玻璃窗口类需要用到父类指针,请创造对象的时候就指明父类指针到this处如: AeroWidget 毛玻璃窗口对象(父类窗口对象指针);不然的话qt大可能会报错(我是这样)!
*/

在widget.cpp中使用如下:

#include "widget.h"
#include "aerowidget.h"Widget::Widget(QWidget *parent) :QWidget(parent)
{AeroWidget aw(this);//然后窗口就成了毛玻璃就不用管了,但是其边框也会透明,不知为何//自己直接复制和增加一些功能和修改都是可以的//窗口无边框//setWindowFlag(Qt::FramelessWindowHint);//窗口顶置//setWindowFlags(Qt::WindowStaysOnTopHint);//窗口半透明//QtWin::enableBlurBehindWindow(this);//setAttribute(Qt::WA_TranslucentBackground);resize(900,600);//改变窗口大小
}

适当可以修改来达到自己想要的效果。

最后附带一张简单窗口的效果图:


原创不易,转载请声明。

c++QT笔记,windows毛玻璃窗口实现封装相关推荐

  1. Qt笔记-Windows管道通信

    这里主要是两个进程中共享数据,本质是共享内存.采用I/O流的方式来访问. 有两种管道: ①匿名管道:父子进程间通信: ②命名管道:两个进程间通信. 这里本例子使用的命名管道进行. 客户端从键盘发送消息 ...

  2. Qt笔记-windows下拷贝文件夹中所有文件

    这里其实各个平台都通用,但个人感觉,如果是linux,直接用shell命名.更加方便. 这里逻辑是这样的. 递归函数,直接先找到最里面,把文件拷贝.然后逐步出来即可! 下面是代码: generatef ...

  3. Qt 调用 Windows 接口实现窗口置顶

    前言 用 Qt 做 Windows 软件开发,有时候会用到窗口置顶功能,其实 Qt 有自带的接口来实现窗口置顶,但是效果并不太理想,比如说没办法置顶于系统标题栏,或者在全屏状态下如果有键盘事件的时候窗 ...

  4. QT程序 windows窗口置顶和linux窗口置顶遇到的问题和解决方案

    一.QT 窗口置顶 一般情况下,我们开发QT桌面应用程序如需用到窗口置顶操作时,会这样做: setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHin ...

  5. PyQt5学习笔记01----第一个窗口

    写在前面的话 最近想学习一下桌面程序开发,可是MFC臃肿复杂界面难看,而WPF无法跨平台,似乎只剩下了QT这一个选择.本来想借着学习python热情,看看python下有木有什么好看的图形库,怎奈我用 ...

  6. qt如何把父窗口的变量传给子窗口_父窗口和iframe子窗口之间相互传递参数和调用函数或方法...

    1.父窗口向子窗口传递参数: 可以在url中添加参数:2.html?a=1&b=2&c=3 然后在子页面上可用js解析,提供一个函数: function getQueryStr(sAr ...

  7. 使用qt在windows的vs下写串口助手

    这是一篇总结性的文章,主要记录一下自己在写串口助手时遇到的问题和解决方案. 1 如果你和我一样,刚开始接触qt,那写一个可用的串口助手,可以按照下面这些文章的顺序开始. 1 图解Qt安装(Window ...

  8. QT笔记第0篇__Qt基本介绍

    QT笔记第0篇__Qt基本介绍 一.引言 二.Qt简介 三.特点: 四.相关网址 五.参考资料 一.引言 由于算法的实现过程中常常需要制作一些demo来进行功能展示,最开始打算用mfc,于是看了一段几 ...

  9. Colmap编译教程及笔记 [Windows+VS2019+Vcpkg]

    Colmap编译教程及笔记 [Windows+VS2019+Vcpkg] 0 预安装 1. Qt.CUDA.Boost.CGAL的安装 1.1 Boost安装 1.2 CUDA安装 1.2.1 CUD ...

最新文章

  1. 客户端渲染 服务端渲染_这就是赢得客户端渲染的原因
  2. 毕设不会做,怎么办??
  3. mysql binlog_checksum_【原创】研发应该懂的binlog知识(下)
  4. mysql format不要逗号,mysql格式化小数
  5. SpringMVC的数据响应-回写数据-直接回写字符串(应用)
  6. C++笔记(3)——string.h相关的一些小知识
  7. ABP理论学习之日志记录
  8. js_DOM读写节点
  9. Android输入模拟——如何模拟用户输入
  10. Python+Selenium练习篇之7-利用name定位元素
  11. 详解谷歌官方教程 Android插件ADT 9.0.0
  12. 9.iterm 颜色
  13. 监听套接字是非阻塞的,accept()返回的连接套接字是否也是阻塞的?
  14. 以用户为师,报喜鸟用需求助力云备份产品创新
  15. html在线快递单号打印,HTML 快递打印模板(示例代码)
  16. 傅里叶分析之掐死教程(完整版)(转)
  17. 计算机时间转换工具,计算机时间的转换
  18. python中set如何添加元素_python中如何在set中添加元素?语句是什么
  19. java中BitSet详解
  20. 遭遇Win32.Loader.c,Trojan.PSW.Win32.GameOnline,Trojan.PSW.Win32.AskTao等1

热门文章

  1. 软件测试面试题之如何对web系统进行全面测试(持续更新中,求关注)
  2. 【报错笔记】Windows下spacy en_core_web_sm安装解决方式
  3. 小数除法用计算机探索规律教学反思,小数除法教学反思
  4. 意迷观看欧冠决赛慌乱踩踏 公共安防再次升级
  5. wait waitpid waitid wait3 wait4
  6. “GANs”与“ODEs”:数学建模的终结?
  7. 利用计算机专业优势 帮助大家,计算机专业优势学校
  8. Innodb事务隔离级别-repeatable read详解
  9. 第 2-3 课:流式布局组件详解(Flow、Wrap)
  10. 笔记 - 汽车之家的反爬手段