转载请注明链接与作者huihui1988

初学QT,边看书边自己做点小东西。最近突然心血来潮,想自己做个小巧点的,界面美观一点的备忘当桌面上。想了半天,发现VISTA/WIN7的Aero效果就不错,况且自己现在就在用WIN7。于是上网找了下QT制作Aero效果的方法。Google之后终于找到了函数和用法。于是做了一个简单的Aero特效窗口

 
以下是头文件和实现文件:
  1. //qtwin.h
  2. #ifndef QTWIN_H
  3. #define QTWIN_H
  4. #include <QColor>
  5. #include <QWidget>
  6. class WindowNotifier;
  7. class QtWin
  8. {
  9. public:
  10. static bool enableAeroWindow(QWidget *widget, bool enable = true);
  11. static bool extendFrameIntoClientArea(QWidget *widget,
  12. int left = -1, int top = -1,
  13. int right = -1, int bottom = -1);
  14. static bool isCompositionEnabled();
  15. static QColor colorizatinColor();
  16. private:
  17. static WindowNotifier *windowNotifier();
  18. };
  19. #endif // QTWIN_H
  20. //qtwin.cpp
  21. #include "qtwin.h"
  22. #include <QLibrary>
  23. #include <QApplication>
  24. #include <QWidget>
  25. #include <QList>
  26. #include <QPointer>
  27. #ifdef Q_WS_WIN
  28. #include <qt_windows.h>
  29. // Blur behind data structures
  30. #define DWM_BB_ENABLE                 0x00000001  // fEnable has been specified
  31. #define DWM_BB_BLURREGION             0x00000002  // hRgnBlur has been specified
  32. #define DWM_BB_TRANSITIONONMAXIMIZED  0x00000004  // fTransitionOnMaximized has been specified
  33. #define WM_DWMCOMPOSITIONCHANGED        0x031E    // Composition changed window message
  34. typedef struct _DWM_BLURBEHIND
  35. {
  36. DWORD dwFlags;
  37. BOOL fEnable;
  38. HRGN hRgnBlur;
  39. BOOL fTransitionOnMaximized;
  40. } DWM_BLURBEHIND, *PDWM_BLURBEHIND;
  41. typedef struct _MARGINS
  42. {
  43. int cxLeftWidth;
  44. int cxRightWidth;
  45. int cyTopHeight;
  46. int cyBottomHeight;
  47. } MARGINS, *PMARGINS;
  48. typedef HRESULT (WINAPI *PtrDwmIsCompositionEnabled)(BOOL* pfEnabled);
  49. typedef HRESULT (WINAPI *PtrDwmExtendFrameIntoClientArea)(HWND hWnd, const MARGINS* pMarInset);
  50. typedef HRESULT (WINAPI *PtrDwmenableAeroWindow)(HWND hWnd, const DWM_BLURBEHIND* pBlurBehind);
  51. typedef HRESULT (WINAPI *PtrDwmGetColorizationColor)(DWORD *pcrColorization, BOOL *pfOpaqueBlend);
  52. static PtrDwmIsCompositionEnabled pDwmIsCompositionEnabled= 0;
  53. static PtrDwmenableAeroWindow pDwmenableAeroWindow = 0;
  54. static PtrDwmExtendFrameIntoClientArea pDwmExtendFrameIntoClientArea = 0;
  55. static PtrDwmGetColorizationColor pDwmGetColorizationColor = 0;
  56. /*
  57. *同步响应DWM状态消息
  58. */
  59. class WindowNotifier : public QWidget
  60. {
  61. public:
  62. WindowNotifier() { winId(); }
  63. void addWidget(QWidget *widget) { widgets.append(widget); }
  64. void removeWidget(QWidget *widget) { widgets.removeAll(widget); }
  65. bool winEvent(MSG *message, long *result);
  66. private:
  67. QWidgetList widgets;
  68. };
  69. static bool resolveLibs()
  70. {
  71. if (!pDwmIsCompositionEnabled) {
  72. QLibrary dwmLib(QString::fromAscii("dwmapi"));
  73. pDwmIsCompositionEnabled =(PtrDwmIsCompositionEnabled)dwmLib.resolve("DwmIsCompositionEnabled");
  74. pDwmExtendFrameIntoClientArea = (PtrDwmExtendFrameIntoClientArea)dwmLib.resolve("DwmExtendFrameIntoClientArea");
  75. pDwmenableAeroWindow = (PtrDwmenableAeroWindow)dwmLib.resolve("DwmenableAeroWindow");
  76. pDwmGetColorizationColor = (PtrDwmGetColorizationColor)dwmLib.resolve("DwmGetColorizationColor");
  77. }
  78. return pDwmIsCompositionEnabled != 0;
  79. }
  80. #endif
  81. /*!
  82. * 检查 DWM 是否开启
  83. *
  84. */
  85. bool QtWin::isCompositionEnabled()
  86. {
  87. #ifdef Q_WS_WIN
  88. if (resolveLibs()) {
  89. HRESULT hr = S_OK;
  90. BOOL isEnabled = false;
  91. hr = pDwmIsCompositionEnabled(&isEnabled);
  92. if (SUCCEEDED(hr))
  93. return isEnabled;
  94. }
  95. #endif
  96. return false;
  97. }
  98. /*!
  99. * 对一个widget实现Aero效果.
  100. *
  101. */
  102. bool QtWin::enableAeroWindow(QWidget *widget, bool enable)
  103. {
  104. Q_ASSERT(widget);
  105. bool result = false;
  106. #ifdef Q_WS_WIN
  107. if (resolveLibs()) {
  108. DWM_BLURBEHIND bb = {0};
  109. HRESULT hr = S_OK;
  110. bb.fEnable = enable;
  111. bb.dwFlags = DWM_BB_ENABLE;
  112. bb.hRgnBlur = NULL;
  113. widget->setAttribute(Qt::WA_TranslucentBackground, enable);
  114. widget->setAttribute(Qt::WA_NoSystemBackground, enable);
  115. hr = pDwmenableAeroWindow(widget->winId(), &bb);
  116. if (SUCCEEDED(hr)) {
  117. result = true;
  118. windowNotifier()->addWidget(widget);
  119. }
  120. }
  121. #endif
  122. return result;
  123. }
  124. /*!
  125. * 设置Aero绘图区
  126. */
  127. bool QtWin::extendFrameIntoClientArea(QWidget *widget, int left, int top, int right, int bottom)
  128. {
  129. Q_ASSERT(widget);
  130. Q_UNUSED(left);
  131. Q_UNUSED(top);
  132. Q_UNUSED(right);
  133. Q_UNUSED(bottom);
  134. bool result = false;
  135. #ifdef Q_WS_WIN
  136. if (resolveLibs()) {
  137. QLibrary dwmLib(QString::fromAscii("dwmapi"));
  138. HRESULT hr = S_OK;
  139. MARGINS m = {left, top, right, bottom};
  140. hr = pDwmExtendFrameIntoClientArea(widget->winId(), &m);
  141. if (SUCCEEDED(hr)) {
  142. result = true;
  143. windowNotifier()->addWidget(widget);
  144. }
  145. widget->setAttribute(Qt::WA_TranslucentBackground, result);
  146. }
  147. #endif
  148. return result;
  149. }
  150. /*!
  151. * 返回当前窗口颜色.
  152. */
  153. QColor QtWin::colorizatinColor()
  154. {
  155. QColor resultColor = QApplication::palette().window().color();
  156. #ifdef Q_WS_WIN
  157. if (resolveLibs()) {
  158. DWORD color = 0;
  159. BOOL opaque = FALSE;
  160. QLibrary dwmLib(QString::fromAscii("dwmapi"));
  161. HRESULT hr = S_OK;
  162. hr = pDwmGetColorizationColor(&color, &opaque);
  163. if (SUCCEEDED(hr))
  164. resultColor = QColor(color);
  165. }
  166. #endif
  167. return resultColor;
  168. }
  169. #ifdef Q_WS_WIN
  170. WindowNotifier *QtWin::windowNotifier()
  171. {
  172. static WindowNotifier *windowNotifierInstance = 0;
  173. if (!windowNotifierInstance)
  174. windowNotifierInstance = new WindowNotifier;
  175. return windowNotifierInstance;
  176. }
  177. /* 所有窗口响应 DWM 状态变换消息 */
  178. bool WindowNotifier::winEvent(MSG *message, long *result)
  179. {
  180. if (message && message->message == WM_DWMCOMPOSITIONCHANGED) {
  181. bool compositionEnabled = QtWin::isCompositionEnabled();
  182. foreach(QWidget * widget, widgets) {
  183. if (widget) {
  184. widget->setAttribute(Qt::WA_NoSystemBackground, compositionEnabled);
  185. }
  186. widget->update();
  187. }
  188. }
  189. return QWidget::winEvent(message, result);
  190. }
  191. #endif
  192. 使用的时候只需要在生成窗口的main.cpp中#include "qtwin.h",并使用相关函数,以下是main.cpp文件:
  193. #include <QtGui/QApplication>
  194. #include "widget.h"
  195. #include "qtwin.h"
  196. int main(int argc, char *argv[])
  197. {
  198. QApplication a(argc, argv);
  199. Widget window;
  200. window.setGeometry(1040,0,240,120);
  201. window.setWindowFlags(Qt::CustomizeWindowHint);
  202. #ifdef Q_WS_X11
  203. window.setAttribute(Qt::WA_TranslucentBackground);
  204. window.setAttribute(Qt::WA_NoSystemBackground, false);
  205. QPalette pal = window.palette();
  206. QColor bg = pal.window().color();
  207. bg.setAlpha(180);
  208. pal.setColor(QPalette::Window, bg);
  209. window.setPalette(pal);
  210. window.ensurePolished(); // workaround Oxygen filling the background
  211. window.setAttribute(Qt::WA_StyledBackground, false);
  212. #endif
  213. if (QtWin::isCompositionEnabled()) {
  214. QtWin::extendFrameIntoClientArea(&window);
  215. window.setContentsMargins(0, 0, 0, 0);
  216. }
  217. window.show();
  218. return a.exec();
  219. }

http://blog.csdn.net/huihui1988/article/details/5601497

Qt制作Aero特效窗口的更多相关文章

  1. Qt Style Sheets制作UI特效

    使用Qt Style Sheets制作UI特效  博客出处:http://developer.nokia.com/community/wiki/%E4%BD%BF%E7%94%A8Qt_Style_S ...

  2. QT制作一个图片播放器

    前言:使用qt制作了一个简单的图片播放器,可以播放gif.png等格式图片 先来看看播放器的功能(当然是很简陋的,没有很深入的设计): 1.点击图片列表中图片进行播放. 2.自动播放,播放的图片的间隔 ...

  3. QT笔记之不规则窗口的实现

    QT实现的不规则窗口,是根据图片的形状显示 1.去标题栏 2.设置窗口背景为透明色 3.最后给窗口设置背景色 注:背景图为镂空的 格式为.png 图片资源下载:http://pan.baidu.com ...

  4. QT笔记之自定义窗口拖拽移动

    1.QT自定义标题栏,拖拽标题栏移动窗口(只能拖拽标题,其他位置无法拖拽) 方法一: 转载:http://blog.sina.com.cn/s/blog_4ba5b45e0102e83h.html . ...

  5. Qt 制作安装包

    Qt 制作在线.离线 安装包 见如下文档

  6. Qt 鼠标样式特效探索样例(一)——利用时间器调用QWidget.move()函数

    Qt 鼠标样式特效探索样例(一)       心血来潮,突然想在Qt里玩一把鼠标样式,想到在浏览网页时,经常看到漂亮的鼠标动画,于是今天摸索着乱写个粗糙的demo,来满足自己的好奇心. 效果图 方案要 ...

  7. Qt全屏显示窗口、子窗口的相关函数

    Qt全屏显示函数         window.showFullScreen() Qt最大化显示函数         window.showMaximized() Qt最小化显示函数         ...

  8. Qt控制台和带窗口的区别_mickelfeng_新浪博客

    Qt控制台和带窗口的区别_mickelfeng_新浪博客     t控制台和带窗口的区别    (2012-04-30 10:50:53)    标签:    杂谈        分类: C/C    ...

  9. 使用qt制作一个简单的计算器

    前言:今天使用qt制作了一个很简单的计算器,觉得挺有意思的,所以在这里跟大家分享一下. 这里先跟大家说说使用到的函数: 一.槽连接函数 connect(信号发送者,发送的信号,信号接收者,信号接收者的 ...

随机推荐

  1. key转成pvf

    https://www.godaddy.com/help/converting-an-exported-pfx-code-signing-file-to-pvk-and-spc-files-using ...

  2. UVa 1449 - Dominating Patterns (AC自动机)

    题目大意:给出多个字符串模板,并给出一个文本串,求在文本串中出现最多的模板,输出最多的次数并输出该模板(若有多个满足,则按输入顺序输出). 思路:赤裸裸的 AC自动机,上模板. 代码: #includ ...

  3. TCP快速重传和快速恢复

    当tcp传送一个分组时会设置一个定时器,如果在规定的实际间隔内没有收到ACK分组,那么则重新传输该分组,但是 如果tcp收到三个连续的ACK分组,此时不管是否过超时间隔则重传该分组,具体步骤如下: 1 ...

  4. 第04讲- Android项目目录结构分析

    学习内容: 1.        认识R类(R.java)的作用 R.java是在建立项目时自动生成的,这个文件是只读模式,不能更改.R类中包含很多静态类,且静态类的名字都与res中的一个名字对应,即R ...

  5. proxy set 拦截

    set方法用来拦截某个属性的赋值操作. 假定Person对象有一个age属性,该属性应该是一个不大于200的整数,那么可以使用Proxy保证age的属性值符合要求. let validator = { ...

  6. python学习之路-1 python简介及安装方法

    python简介 一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. 目前最新版本为3.5.1,发布于2015年12月07日 ...

  7. (转)Tomcat 7 访问 Manager 和 Host Manager

    配置好 Tomcat 7.0 后,在 tomcat-users.xml 中配置用户角色来访问 localhost:8080 的这样三个按钮总出现问题: Server Status Manager Ap ...

  8. Linux 内核开发 - 进程空间

    1.1 虚拟内存 Linux 的系统.假设每一个任务都独立的占用内存,则实际的物理内存将非常快消耗殆尽.实际上对于前台正在执行的任务来说,所须要要的内存并不多,非常多任务基本不须要执行,也就没有必要一 ...

  9. LR如何监控tomcat性能

    使用LoadRunner做性能测试,一般的直觉是LR只能完成脚本录制和编写模拟用户的请求行为,但是在某些情况下,要监控一些中间件或web服务器的性能时,就不能通过录制脚本来完成了,那么就需要手工来编写 ...

  10. oracle 临时表空间的增删改查

    oracle 临时表空间的增删改查 oracle 临时表空间的增删改查 1.查看临时表空间 (dba_temp_files视图)(v_$tempfile视图)select tablespace_nam ...