QT-磨砂玻璃效果实现

  • 前言
    • 开始

前言

接触QT都挺多年了,今天开始打算把这几年攒下的QT资源记录下来,留个存档吧。今天记录的是windows下(只有win vista|win7支持)的玻璃磨砂效果封装处理,记得最开始接触这个效果的时候还是上学时期,当时只会MFC O__O "…

开始

封装类中使用到三个系统函数DwmIsCompositionEnabledDwmEnableBlurBehindWindowDwmExtendFrameIntoClientArea,这三个系统函数度娘都有很多说明【可以参考这里】,我这里简单说下:

  1. DwmIsCompositionEnabled:判断是否兼容DWM模式,返回TRUE,表示支持玻璃磨砂效果,否则为不支持;
  2. DwmEnableBlurBehindWindow:开启或关闭指定区域的玻璃磨砂效果;
  3. DwmExtendFrameIntoClientArea:窗口边框向客户区扩展的玻璃磨砂效果;

封装类中使用动态加载方式来引用这3个系统库Dwmapi.dll,因为使用这个封装类的程序可能要跑在XP系统中,而XP中是没有Dwmapi.dll这个系统库的。

源码
QOwnAeroClass.h

#ifndef QOWNAEROCLASS_H
#define QOWNAEROCLASS_H#include<windows.h>
#include<QLibrary>
#include<QRect>#ifndef DWM_BB_ENABLE
//*****************用于XP下的结构定义************
#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 specifiedtypedef struct _DWM_BLURBEHIND
{DWORD dwFlags;BOOL fEnable;HRGN hRgnBlur;BOOL fTransitionOnMaximized;
} DWM_BLURBEHIND, *PDWM_BLURBEHIND;#endiftypedef struct _MARGINS
{int cxLeftWidth;      // width of left border that retains its sizeint cxRightWidth;     // width of right border that retains its sizeint cyTopHeight;      // height of top border that retains its sizeint cyBottomHeight;   // height of bottom border that retains its size
} MARGINS, *PMARGINS;typedef HRESULT (WINAPI* MyDwmIsCompositionEnabled)(BOOL *pBEnable);typedef HRESULT (WINAPI* MyDwmExtendFrameIntoClientArea)(HWND hWnd,const MARGINS *pMargins);typedef HRESULT (WINAPI* MyDwmEnableBlurBehindWindow)(HWND hWnd,const DWM_BLURBEHIND *pDWM_bulr);class QOwnAeroClass
{
private:QOwnAeroClass(void);~QOwnAeroClass(void);enum SysType{UNKNOW=0,WINME,WIN98,WIN2K,WINXP,VISTA,WIN7,};public://返回是否具有透明效果static bool IsCompositionEnabled();//取消透明效果static bool cancelAeroStyle(HWND hWnd);//设置全局透明效果static bool setAeroStyle(HWND hWnd,bool bFrame=true,int nPadding = 6, QRect* pNewRect = NULL);//获取系统版本信息static SysType getSysVersion();//DWM接口static MyDwmIsCompositionEnabled m_MyDwmIsCompositionEnabledFun;static MyDwmExtendFrameIntoClientArea m_MyDwmExtendFrameIntoClientAreaFun;static MyDwmEnableBlurBehindWindow m_MyDwmEnableBlurBehindWindowFun;//初始化DWM接口static bool InitDwmPort();//接口dllstatic QLibrary m_DwnLib;private:};
#endif // QOWNAEROCLASS_H

QOwnAeroClass.cpp

#include "QOwnAeroClass.h"
#include <QDebug>MyDwmIsCompositionEnabled QOwnAeroClass::m_MyDwmIsCompositionEnabledFun=NULL;
MyDwmExtendFrameIntoClientArea QOwnAeroClass::m_MyDwmExtendFrameIntoClientAreaFun=NULL;
MyDwmEnableBlurBehindWindow QOwnAeroClass::m_MyDwmEnableBlurBehindWindowFun=NULL;QLibrary QOwnAeroClass::m_DwnLib;QOwnAeroClass::QOwnAeroClass(void)
{
}QOwnAeroClass::~QOwnAeroClass(void)
{
}
//初始化DWM接口,Theme接口
bool QOwnAeroClass::InitDwmPort()
{m_MyDwmEnableBlurBehindWindowFun = NULL;m_MyDwmExtendFrameIntoClientAreaFun = NULL;m_MyDwmIsCompositionEnabledFun = NULL;if(m_DwnLib.isLoaded()){m_DwnLib.unload();}m_DwnLib.setFileName("Dwmapi.dll");if(!m_DwnLib.load())return false;m_MyDwmIsCompositionEnabledFun = (MyDwmIsCompositionEnabled)m_DwnLib.resolve("DwmIsCompositionEnabled");m_MyDwmExtendFrameIntoClientAreaFun = (MyDwmExtendFrameIntoClientArea)m_DwnLib.resolve("DwmExtendFrameIntoClientArea");m_MyDwmEnableBlurBehindWindowFun = (MyDwmEnableBlurBehindWindow)m_DwnLib.resolve("DwmEnableBlurBehindWindow");if(m_MyDwmEnableBlurBehindWindowFun == NULL ||m_MyDwmExtendFrameIntoClientAreaFun == NULL ||m_MyDwmIsCompositionEnabledFun == NULL){return false;}return true;
}
//返回是否具有透明效果
bool QOwnAeroClass::IsCompositionEnabled()
{//return false;BOOL bCompEnabled = FALSE;SysType sysType;sysType = getSysVersion();if(sysType <VISTA)return false;if(m_MyDwmIsCompositionEnabledFun == NULL){if(!InitDwmPort()){qDebug() << "QOwnAeroClass::IsCompositionEnabled InitDWM fail!!!!";return false;}}m_MyDwmIsCompositionEnabledFun(&bCompEnabled);if(bCompEnabled){return true;}elsereturn false;
}
//取消透明效果
bool QOwnAeroClass::cancelAeroStyle(HWND hWnd)
{if(::IsWindow(hWnd)){SysType sysType;sysType = getSysVersion();if(sysType < VISTA)return false;if(m_MyDwmExtendFrameIntoClientAreaFun == NULL|| m_MyDwmEnableBlurBehindWindowFun == NULL){if(!InitDwmPort()){qDebug() << "QOwnAeroClass::cancelAeroStyle InitDWM fail!!!!";return false;}}MARGINS margins = {0};  //将取消m_MyDwmExtendFrameIntoClientAreaFun(hWnd, &margins);//DWM_BLURBEHIND bb = {0};bb.dwFlags = DWM_BB_ENABLE /*| DWM_BB_BLURREGION*/;bb.fEnable = false;bb.hRgnBlur = NULL;m_MyDwmEnableBlurBehindWindowFun(hWnd, &bb);return true;}return false;
}
//设置全局透明效果
bool QOwnAeroClass::setAeroStyle(HWND hWnd,bool bFrame,int nPadding, QRect* pNewRect)
{if(!::IsWindow(hWnd))return false;SysType sysType;sysType = getSysVersion();if(sysType <VISTA)return false;//先取消在设置cancelAeroStyle(hWnd);//全屏效果if(bFrame){if(m_MyDwmExtendFrameIntoClientAreaFun == NULL){if(!InitDwmPort()){qDebug() << "QOwnAeroClass::setAeroStyle InitDWM fail!!!!";return false;}}MARGINS margins = {-1};  //将效果m_MyDwmExtendFrameIntoClientAreaFun(hWnd, &margins);}//局部效果else{DWM_BLURBEHIND blurBehind = { 0 };blurBehind.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;blurBehind.fEnable = true;//blurBehind.fTransitionOnMaximized = TRUE;RECT winRect,NewRect;::GetWindowRect(hWnd,&winRect);if(pNewRect != NULL){NewRect.top = nPadding;NewRect.left = nPadding;NewRect.bottom = pNewRect->height()-nPadding;NewRect.right = pNewRect->width()-nPadding;}else{NewRect.top = nPadding;NewRect.left = nPadding;NewRect.bottom = (winRect.bottom - winRect.top)-nPadding;NewRect.right = (winRect.right - winRect.left)-nPadding;}/*winRect.left += 6;winRect.top += 6;winRect.bottom -= 6;winRect.right -= 6;*/HRGN hRgn = ::CreateRectRgn(NewRect.left,NewRect.top,NewRect.right,NewRect.bottom); blurBehind.hRgnBlur = hRgn;m_MyDwmEnableBlurBehindWindowFun(hWnd,&blurBehind);}return true;
}//获取系统版本信息
QOwnAeroClass::SysType QOwnAeroClass::getSysVersion()
{OSVERSIONINFO Version;ZeroMemory(&Version,sizeof(OSVERSIONINFO));Version.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);GetVersionEx(&Version);  if (Version.dwPlatformId==VER_PLATFORM_WIN32_NT)  {if((Version.dwMajorVersion==5)&&(Version.dwMinorVersion==0)){return WIN2K;}else if((Version.dwMajorVersion==5)&&(Version.dwMinorVersion>0)){return WINXP;}else if((Version.dwMajorVersion==6)&&(Version.dwMinorVersion==0))return VISTA;else if((Version.dwMajorVersion>=6))return WIN7;}else if(Version.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS){if ((Version.dwMajorVersion == 4) && (Version.dwMinorVersion < 90) ){return WIN98;}if ((Version.dwMajorVersion == 4) && (Version.dwMinorVersion >= 90) ){return WINME;}}return UNKNOW;
}

QT-磨砂玻璃效果实现相关推荐

  1. QT编写磨砂玻璃效果函数

    QT图像处理与人脸识别的学习小项目 1.1 QT编写磨砂玻璃效果函数 文章目录 QT图像处理与人脸识别的学习小项目 前言 一.磨砂玻璃原理 二.编写步骤 1.编写代码 2.结果展示 总结 前言 本文描 ...

  2. qt设计为磨砂玻璃效果_Pixyz的2020.1更新为数据准备带来了磨砂和光泽

    qt设计为磨砂玻璃效果 For their 2020.1 release, our partners at Pixyz have focused on improvements ranging fro ...

  3. ppt文字磨砂玻璃效果制作教程

    ppt文字磨砂玻璃效果制作幻灯片教程 < 年终总结ppt模板img alt="幻灯片4.JPG" src="http://img.2ppt.cn/uploads/j ...

  4. Flutter教程之Flutter 中的磨砂玻璃效果

    磨砂玻璃效果是flutter中一个很酷的UI概念,让我们的UI看起来更有吸引力.它基本上是一个具有降低不透明度的模糊叠加层,以区分或减少某个视图.此功能看起来确实不错,但它会影响应用程序的性能. 那么 ...

  5. flutter 中实现磨砂玻璃效果

    flutter 中实现磨砂玻璃效果 前言 磨砂玻璃效果是一个很酷的用户界面概念,使我们的用户界面看起来更有吸引力.它基本上是一个模糊的覆盖与减少不透明度,以区分或减少某一观点.这个功能看起来确实不错, ...

  6. android 磨砂玻璃效果

    今天工作中需要磨砂玻璃效果,就从网上查找一番,最后查找适合自己的,我的apk版本是android4.4的,所以就下了一个方法 代码如下: 1.磨砂效果方法 @SuppressLint("In ...

  7. 如何用Photoshop制作iOS 7透明磨砂玻璃效果

    半个月前,苹果发布了iOS 7系统正式版,于是伴随着扁平化界面一同而来的透明磨砂玻璃效果让所有支持iOS 7的设备的用户都能用上了.因此,我做了一套iOS 7的透明磨砂玻璃效果的UI.可是,没想到很多 ...

  8. qt画笔效果笔锋:铅笔、画笔、钢笔、毛笔、蜡笔

    qt画笔效果笔锋:铅笔.画笔.钢笔.毛笔.蜡笔体验 体验demo下载连接:https://download.csdn.net/download/u012532263/87740902?spm=1001 ...

  9. qt动画效果_Qt编写自定义控件44-天气仪表盘

    一.前言 天气仪表盘控件是所有控件中唯一一个使用了svg矢量图的控件,各种天气图标采用的矢量图,颜色变换采用动态载入svg的内容更改生成的,其实也可以采用图形字体来做,本次控件为了熟悉下svg在Qt中 ...

  10. html 磨砂 原理,使用HTML和CSS设计磨砂玻璃效果

    在本文中,我们将使用bootstrap 4卡类来实现毛玻璃效果. 方法: 1.样式设置主体:首先,为您的网页设置背景.将以下代码写在 的CSSbody { background-image: url( ...

最新文章

  1. node + express + mongodb 手动配置
  2. VC\JS Base64转码
  3. Linux下搭建FTP服务器笔记
  4. KnockoutJS 3.X API 第五章 高级应用(2) 控制后代绑定
  5. Git 基础 —— 配置与日志信息
  6. 线上python课程一般多少钱-python学习费用多少合适
  7. android启动过程之init.rc文件浅析
  8. android 魅族扫码,教你扫码登录王者荣耀,支持魅族OPPO华为小米苹果安卓等手机,超简单...
  9. win和linux双系统安装教程
  10. java使用Rocksdb
  11. 软考中级软件设计师该怎么备考
  12. Linux下调用wps的Tables接口,WPS二次开发简单示例
  13. 《居里夫人自传》读后感
  14. 字符串匹配算法之Aho-Corasick
  15. CyanogenMod精简手记
  16. 拿到一份代码如何跑起来
  17. windows系统安全基础知识——系统进程与病毒
  18. word插入向上向下取整符号
  19. 06-树(tree)
  20. ios调用微信支付提示当前页面的URL未注册

热门文章

  1. 2017 TOMM-A Discriminatively Learned CNN Embedding for Person Re-identification
  2. 基于ORB-SLAM2实时构建稠密点云
  3. PDFCrackers Plus版
  4. 打印信息无法连接服务器,打印机无法连接服务器
  5. 美国亿万富翁悬赏百万解数学难题
  6. 服务器修改mysql登录密码忘了怎么办,云服务器mysql密码重置密码忘记了
  7. 手机iCloud储存空间已满,怎么解决?
  8. Flutter实践之高仿有妖气漫画,移动客户端开发工程师专业
  9. Gitlab上传代码时报错文件太大无法上传
  10. 20071011听力原文