Qt制作Aero特效窗口
转载请注明链接与作者huihui1988
初学QT,边看书边自己做点小东西。最近突然心血来潮,想自己做个小巧点的,界面美观一点的备忘当桌面上。想了半天,发现VISTA/WIN7的Aero效果就不错,况且自己现在就在用WIN7。于是上网找了下QT制作Aero效果的方法。Google之后终于找到了函数和用法。于是做了一个简单的Aero特效窗口
- //qtwin.h
- #ifndef QTWIN_H
- #define QTWIN_H
- #include <QColor>
- #include <QWidget>
- class WindowNotifier;
- class QtWin
- {
- public:
- static bool enableAeroWindow(QWidget *widget, bool enable = true);
- static bool extendFrameIntoClientArea(QWidget *widget,
- int left = -1, int top = -1,
- int right = -1, int bottom = -1);
- static bool isCompositionEnabled();
- static QColor colorizatinColor();
- private:
- static WindowNotifier *windowNotifier();
- };
- #endif // QTWIN_H
- //qtwin.cpp
- #include "qtwin.h"
- #include <QLibrary>
- #include <QApplication>
- #include <QWidget>
- #include <QList>
- #include <QPointer>
- #ifdef Q_WS_WIN
- #include <qt_windows.h>
- // Blur behind data structures
- #define DWM_BB_ENABLE 0x00000001 // fEnable has been specified
- #define DWM_BB_BLURREGION 0x00000002 // hRgnBlur has been specified
- #define DWM_BB_TRANSITIONONMAXIMIZED 0x00000004 // fTransitionOnMaximized has been specified
- #define WM_DWMCOMPOSITIONCHANGED 0x031E // Composition changed window message
- typedef struct _DWM_BLURBEHIND
- {
- DWORD dwFlags;
- BOOL fEnable;
- HRGN hRgnBlur;
- BOOL fTransitionOnMaximized;
- } DWM_BLURBEHIND, *PDWM_BLURBEHIND;
- typedef struct _MARGINS
- {
- int cxLeftWidth;
- int cxRightWidth;
- int cyTopHeight;
- int cyBottomHeight;
- } MARGINS, *PMARGINS;
- typedef HRESULT (WINAPI *PtrDwmIsCompositionEnabled)(BOOL* pfEnabled);
- typedef HRESULT (WINAPI *PtrDwmExtendFrameIntoClientArea)(HWND hWnd, const MARGINS* pMarInset);
- typedef HRESULT (WINAPI *PtrDwmenableAeroWindow)(HWND hWnd, const DWM_BLURBEHIND* pBlurBehind);
- typedef HRESULT (WINAPI *PtrDwmGetColorizationColor)(DWORD *pcrColorization, BOOL *pfOpaqueBlend);
- static PtrDwmIsCompositionEnabled pDwmIsCompositionEnabled= 0;
- static PtrDwmenableAeroWindow pDwmenableAeroWindow = 0;
- static PtrDwmExtendFrameIntoClientArea pDwmExtendFrameIntoClientArea = 0;
- static PtrDwmGetColorizationColor pDwmGetColorizationColor = 0;
- /*
- *同步响应DWM状态消息
- */
- class WindowNotifier : public QWidget
- {
- public:
- WindowNotifier() { winId(); }
- void addWidget(QWidget *widget) { widgets.append(widget); }
- void removeWidget(QWidget *widget) { widgets.removeAll(widget); }
- bool winEvent(MSG *message, long *result);
- private:
- QWidgetList widgets;
- };
- static bool resolveLibs()
- {
- if (!pDwmIsCompositionEnabled) {
- QLibrary dwmLib(QString::fromAscii("dwmapi"));
- pDwmIsCompositionEnabled =(PtrDwmIsCompositionEnabled)dwmLib.resolve("DwmIsCompositionEnabled");
- pDwmExtendFrameIntoClientArea = (PtrDwmExtendFrameIntoClientArea)dwmLib.resolve("DwmExtendFrameIntoClientArea");
- pDwmenableAeroWindow = (PtrDwmenableAeroWindow)dwmLib.resolve("DwmenableAeroWindow");
- pDwmGetColorizationColor = (PtrDwmGetColorizationColor)dwmLib.resolve("DwmGetColorizationColor");
- }
- return pDwmIsCompositionEnabled != 0;
- }
- #endif
- /*!
- * 检查 DWM 是否开启
- *
- */
- bool QtWin::isCompositionEnabled()
- {
- #ifdef Q_WS_WIN
- if (resolveLibs()) {
- HRESULT hr = S_OK;
- BOOL isEnabled = false;
- hr = pDwmIsCompositionEnabled(&isEnabled);
- if (SUCCEEDED(hr))
- return isEnabled;
- }
- #endif
- return false;
- }
- /*!
- * 对一个widget实现Aero效果.
- *
- */
- bool QtWin::enableAeroWindow(QWidget *widget, bool enable)
- {
- Q_ASSERT(widget);
- bool result = false;
- #ifdef Q_WS_WIN
- if (resolveLibs()) {
- DWM_BLURBEHIND bb = {0};
- HRESULT hr = S_OK;
- bb.fEnable = enable;
- bb.dwFlags = DWM_BB_ENABLE;
- bb.hRgnBlur = NULL;
- widget->setAttribute(Qt::WA_TranslucentBackground, enable);
- widget->setAttribute(Qt::WA_NoSystemBackground, enable);
- hr = pDwmenableAeroWindow(widget->winId(), &bb);
- if (SUCCEEDED(hr)) {
- result = true;
- windowNotifier()->addWidget(widget);
- }
- }
- #endif
- return result;
- }
- /*!
- * 设置Aero绘图区
- */
- bool QtWin::extendFrameIntoClientArea(QWidget *widget, int left, int top, int right, int bottom)
- {
- Q_ASSERT(widget);
- Q_UNUSED(left);
- Q_UNUSED(top);
- Q_UNUSED(right);
- Q_UNUSED(bottom);
- bool result = false;
- #ifdef Q_WS_WIN
- if (resolveLibs()) {
- QLibrary dwmLib(QString::fromAscii("dwmapi"));
- HRESULT hr = S_OK;
- MARGINS m = {left, top, right, bottom};
- hr = pDwmExtendFrameIntoClientArea(widget->winId(), &m);
- if (SUCCEEDED(hr)) {
- result = true;
- windowNotifier()->addWidget(widget);
- }
- widget->setAttribute(Qt::WA_TranslucentBackground, result);
- }
- #endif
- return result;
- }
- /*!
- * 返回当前窗口颜色.
- */
- QColor QtWin::colorizatinColor()
- {
- QColor resultColor = QApplication::palette().window().color();
- #ifdef Q_WS_WIN
- if (resolveLibs()) {
- DWORD color = 0;
- BOOL opaque = FALSE;
- QLibrary dwmLib(QString::fromAscii("dwmapi"));
- HRESULT hr = S_OK;
- hr = pDwmGetColorizationColor(&color, &opaque);
- if (SUCCEEDED(hr))
- resultColor = QColor(color);
- }
- #endif
- return resultColor;
- }
- #ifdef Q_WS_WIN
- WindowNotifier *QtWin::windowNotifier()
- {
- static WindowNotifier *windowNotifierInstance = 0;
- if (!windowNotifierInstance)
- windowNotifierInstance = new WindowNotifier;
- return windowNotifierInstance;
- }
- /* 所有窗口响应 DWM 状态变换消息 */
- bool WindowNotifier::winEvent(MSG *message, long *result)
- {
- if (message && message->message == WM_DWMCOMPOSITIONCHANGED) {
- bool compositionEnabled = QtWin::isCompositionEnabled();
- foreach(QWidget * widget, widgets) {
- if (widget) {
- widget->setAttribute(Qt::WA_NoSystemBackground, compositionEnabled);
- }
- widget->update();
- }
- }
- return QWidget::winEvent(message, result);
- }
- #endif
- 使用的时候只需要在生成窗口的main.cpp中#include "qtwin.h",并使用相关函数,以下是main.cpp文件:
- #include <QtGui/QApplication>
- #include "widget.h"
- #include "qtwin.h"
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- Widget window;
- window.setGeometry(1040,0,240,120);
- window.setWindowFlags(Qt::CustomizeWindowHint);
- #ifdef Q_WS_X11
- window.setAttribute(Qt::WA_TranslucentBackground);
- window.setAttribute(Qt::WA_NoSystemBackground, false);
- QPalette pal = window.palette();
- QColor bg = pal.window().color();
- bg.setAlpha(180);
- pal.setColor(QPalette::Window, bg);
- window.setPalette(pal);
- window.ensurePolished(); // workaround Oxygen filling the background
- window.setAttribute(Qt::WA_StyledBackground, false);
- #endif
- if (QtWin::isCompositionEnabled()) {
- QtWin::extendFrameIntoClientArea(&window);
- window.setContentsMargins(0, 0, 0, 0);
- }
- window.show();
- return a.exec();
- }
http://blog.csdn.net/huihui1988/article/details/5601497
Qt制作Aero特效窗口的更多相关文章
- Qt Style Sheets制作UI特效
使用Qt Style Sheets制作UI特效 博客出处:http://developer.nokia.com/community/wiki/%E4%BD%BF%E7%94%A8Qt_Style_S ...
- QT制作一个图片播放器
前言:使用qt制作了一个简单的图片播放器,可以播放gif.png等格式图片 先来看看播放器的功能(当然是很简陋的,没有很深入的设计): 1.点击图片列表中图片进行播放. 2.自动播放,播放的图片的间隔 ...
- QT笔记之不规则窗口的实现
QT实现的不规则窗口,是根据图片的形状显示 1.去标题栏 2.设置窗口背景为透明色 3.最后给窗口设置背景色 注:背景图为镂空的 格式为.png 图片资源下载:http://pan.baidu.com ...
- QT笔记之自定义窗口拖拽移动
1.QT自定义标题栏,拖拽标题栏移动窗口(只能拖拽标题,其他位置无法拖拽) 方法一: 转载:http://blog.sina.com.cn/s/blog_4ba5b45e0102e83h.html . ...
- Qt 制作安装包
Qt 制作在线.离线 安装包 见如下文档
- Qt 鼠标样式特效探索样例(一)——利用时间器调用QWidget.move()函数
Qt 鼠标样式特效探索样例(一) 心血来潮,突然想在Qt里玩一把鼠标样式,想到在浏览网页时,经常看到漂亮的鼠标动画,于是今天摸索着乱写个粗糙的demo,来满足自己的好奇心. 效果图 方案要 ...
- Qt全屏显示窗口、子窗口的相关函数
Qt全屏显示函数 window.showFullScreen() Qt最大化显示函数 window.showMaximized() Qt最小化显示函数 ...
- Qt控制台和带窗口的区别_mickelfeng_新浪博客
Qt控制台和带窗口的区别_mickelfeng_新浪博客 t控制台和带窗口的区别 (2012-04-30 10:50:53) 标签: 杂谈 分类: C/C ...
- 使用qt制作一个简单的计算器
前言:今天使用qt制作了一个很简单的计算器,觉得挺有意思的,所以在这里跟大家分享一下. 这里先跟大家说说使用到的函数: 一.槽连接函数 connect(信号发送者,发送的信号,信号接收者,信号接收者的 ...
随机推荐
- key转成pvf
https://www.godaddy.com/help/converting-an-exported-pfx-code-signing-file-to-pvk-and-spc-files-using ...
- UVa 1449 - Dominating Patterns (AC自动机)
题目大意:给出多个字符串模板,并给出一个文本串,求在文本串中出现最多的模板,输出最多的次数并输出该模板(若有多个满足,则按输入顺序输出). 思路:赤裸裸的 AC自动机,上模板. 代码: #includ ...
- TCP快速重传和快速恢复
当tcp传送一个分组时会设置一个定时器,如果在规定的实际间隔内没有收到ACK分组,那么则重新传输该分组,但是 如果tcp收到三个连续的ACK分组,此时不管是否过超时间隔则重传该分组,具体步骤如下: 1 ...
- 第04讲- Android项目目录结构分析
学习内容: 1. 认识R类(R.java)的作用 R.java是在建立项目时自动生成的,这个文件是只读模式,不能更改.R类中包含很多静态类,且静态类的名字都与res中的一个名字对应,即R ...
- proxy set 拦截
set方法用来拦截某个属性的赋值操作. 假定Person对象有一个age属性,该属性应该是一个不大于200的整数,那么可以使用Proxy保证age的属性值符合要求. let validator = { ...
- python学习之路-1 python简介及安装方法
python简介 一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. 目前最新版本为3.5.1,发布于2015年12月07日 ...
- (转)Tomcat 7 访问 Manager 和 Host Manager
配置好 Tomcat 7.0 后,在 tomcat-users.xml 中配置用户角色来访问 localhost:8080 的这样三个按钮总出现问题: Server Status Manager Ap ...
- Linux 内核开发 - 进程空间
1.1 虚拟内存 Linux 的系统.假设每一个任务都独立的占用内存,则实际的物理内存将非常快消耗殆尽.实际上对于前台正在执行的任务来说,所须要要的内存并不多,非常多任务基本不须要执行,也就没有必要一 ...
- LR如何监控tomcat性能
使用LoadRunner做性能测试,一般的直觉是LR只能完成脚本录制和编写模拟用户的请求行为,但是在某些情况下,要监控一些中间件或web服务器的性能时,就不能通过录制脚本来完成了,那么就需要手工来编写 ...
- oracle 临时表空间的增删改查
oracle 临时表空间的增删改查 oracle 临时表空间的增删改查 1.查看临时表空间 (dba_temp_files视图)(v_$tempfile视图)select tablespace_nam ...