这个程序主要是出于娱乐和学习的目的制作的。单就这个功能而言WallpaperEngine的创意工坊中已经有了,WallpaperEngine是把一个浏览器窗口嵌入了桌面,然后在浏览器中加载各种页面作为壁纸。其实QT也可以用这种方法来实现动态壁纸,不过本程序是将一个QOpenGLWindow作为桌面实现的,省去了浏览器,牺牲了灵活性,不过体积也得以缩减。你可以方便地设置背景图片,修改水波参数来获得不同的效果。

环境

Windows7
Qt Creator 4.5.1
Qt 5.10.1 MSVC2017_64
本程序使用了WinAPI,只支持Windows系统

效果图

获取程序

代码

github

编译好的程序

Release

关于将窗口嵌入桌面

尽管我认为这个程序最难的部分,也就是水波效果的部分,已经在之前完成了,但是利用它来实现这个壁纸程序的过程倒也不是那么的一帆风顺,一番修改之后,这个壁纸程序中的代码并不怎么便于复用,如果你想试试给自己的程序界面添加一个有水波效果的背景,可以去我之前的文章看一看,QT使用OpenGL实现水波特效。

动态壁纸程序基本上都是通过将各种窗口嵌入桌面来实现的,相关的文章倒也不少,内容也大致相同。首先获取Windows的桌面窗口句柄,然后再把桌面窗口设为我们自己窗口的父亲,其中基本都使用了SetParent的WinAPI。
然而我下载了他们的代码,至少在我自己的环境中,SetParent是不起作用的,他们都使用了QWidget::showFullScreen()函数,此操作会让窗口变得半独立,你可以通过alt+tab呼出它,令他显示在顶层,但是当你显示桌面时,又发现它渲染在了桌面上,而无论我是否注释掉SetParent这一句,窗口的表现都是一样的。
这种写法我觉得倒是也可以接受,只不过似乎跟SetParent没什么关系。毕竟我们写了一个什么样的QWidget,就可以通过这种方式令其显示在桌面上,操作比较简单,将窗口嵌入桌面的需求也可以说实现了。

不过如果你想把Qt窗口嵌入其他程序,或者是想获得更为理想的效果,可能需要研究一下QWindow相关的类。

关于Qt窗口和其他程序窗口的互相嵌入,Qt中有这样一个函数,文档中如此介绍:

[static] QWindow *QWindow::fromWinId(WId id)
Creates a local representation of a window created by another process or by using native libraries below Qt.
Given the handle id to a native window, this method creates a QWindow object which can be used to represent the window when invoking methods like setParent() and setTransientParent().
This can be used, on platforms which support it, to embed a QWindow inside a native window, or to embed a native window inside a QWindow.
If foreign windows are not supported or embedding the native window failed in the platform plugin, this function returns 0.
Note: The resulting QWindow should not be used to manipulate the underlying native window (besides re-parenting), or to observe state changes of the native window. Any support for these kind of operations is incidental, highly platform dependent and untested.
See also setParent() and setTransientParent().

这样,当你使用一个基于QWindow的窗口时,可以通过如下代码将他嵌入到其他Windows窗口中。

  HWND a;//假设这是某个Windows系统中的窗口句柄QWindow* p=QWindow::fromWinId(reinterpret_cast<WId>(a));this->setParent(p);

但是,QWidget和QWindow是无法直接相互转化的,对于如何将QWidget的内容渲染到QWindow,Qt提供了一个示例,我这个程序中并没有用到所以没继续研究,有这个需求的同学可以查阅QWindow和QBackingStore相关的文档和文章。
Qt提供了QOpenGLWindow这样一个类,而且跟QOpenGLWidget在使用上非常相似,我可以比较容易地将之前的Widget改为Window从而使用上方的方式将窗口嵌入到桌面。

关于找到Windows桌面窗口句柄,我参考的代码中的实现原理大同小异,其中一份代码中给出了解释原理的文章链接Draw Behind Desktop Icons in Windows 8+,我在代码中也按自己的理解写了一部分注释,大家按需阅读吧。

如果想让嵌入桌面的窗口获得鼠标事件,可以通过鼠标钩子实现,此程序就是使用鼠标钩子监听Windows的鼠标消息的。

实现一个动态壁纸通用的部分主要也就是以上的内容了,其他有的没的基本都写到代码注释里了。

最后,欢迎使用此程序,也欢迎评论反馈。

基于QT和OpenGL实现的水波动态壁纸相关推荐

  1. 基于Qt ffmpeg opengl开发跨平台安卓实时投屏软件

    [开源]基于Qt ffmpeg opengl开发跨平台安卓实时投屏软件 码云地址 https://gitee.com/Barryda/QtScrcpy github地址 https://github. ...

  2. qt android glsl,基于Qt的OpenGL学习(1)—— Hello Triangle

    简介 要学习OpenGL的话,强烈安利这个教程JoeyDeVries的learnopengl,这里是中文翻译好的版本.教程中使用OpenGL是通过GLFW这个库,而在Qt中对OpenGL封装得很好,并 ...

  3. 基于Qt的OpenGL可编程管线学习(9)- X射线

    X射线也就是轮廓线,效果如下图所示 原理:物体表面的法线与人眼睛缩成的角度为90度时,刚好能看到物体的轮廓 Fragment shader代码如下: uniform sampler2D U_MainT ...

  4. 基于Qt的OpenGL可编程管线学习(14)- 正片叠底、逆正片叠底

    1.正片叠底 shader // 正片叠底 uniform sampler2D U_MainTexture; uniform sampler2D U_SubTexture;varying vec2 M ...

  5. QT使用openGL绘制一个三角形

    对于opengl的学习来说,绘制一个三角形是学习一种计算机语言时的一个hello world级的入门程序,个人觉得相比主流语言的helloworld,openGL的入门确实是有一些劝退,虽然说有不错的 ...

  6. 基于QT ffmpeg的动态桌面壁纸

    基于QT ffmpeg的动态桌面壁纸 目前制作了一个基于QT ffmpeg的动态桌面壁纸,源码程序在github上 下面为链接: 动态壁纸软件 项目名为 DesktopDynamicWallpaper ...

  7. Qt+mpv制作windows/linux 下的动态壁纸软件(含源码)

    mpv是啥? mpv之前是mediaplayer,windwos之前好像都有预装这个,都来经过发展,现在是一个对跨平台开发很友好的播放器工具. Qt是啥? 制作桌面应用程序的开发语言及工具,基于C++ ...

  8. 基于QT的CHAI3D开发框架搭建

    基于QT的CHAI3D开发框架搭建 CHAI3D简介 CHI3D(计算机触觉和主动界面)是一个开放的C++库,用于计算机触觉.可视化和交互式实时仿真.CHAI3D最初是在斯坦福大学的人工智能实验室开始 ...

  9. 《基于Qt的VR编辑器开发》(Yanlz+Unity+SteamVR+5G+AI+VR云游戏+Qt+编辑器+跨平台+人机交互+触发事件+立钻哥哥+==)

    <基于Qt的VR编辑器开发> <基于Qt的VR编辑器开发> 版本 作者 参与者 完成日期 备注 YanlzFramework_Qt_V01_1.0 严立钻 2019.09.04 ...

最新文章

  1. 动态规划中的多段图问题
  2. golang 常量简介
  3. linux nodejs环境部署,Linux 部署Nodejs 环境 (自学记录篇)
  4. python练手经典100例微盘_Python练手项目实例汇总(附源码下载)
  5. 二进制文件更新程序_APR 6.17程序文件更新
  6. GitHub年度报告出炉:中国开源贡献仅次美国、Python成第二热门语言
  7. golang 项目设置后台运行
  8. (转)Bootstrap3 概述
  9. Fatal error: Class 'GearmanClient' not found解决方法
  10. 20211213软件测试基础达内视频笔记
  11. 玩转Light Blue之添加设备信息
  12. java菜鸟突破面试系列-终章
  13. wps word转pdf后出现空白页的删除方式
  14. python绘制女孩_[宜配屋]听图阁
  15. 【7gyy】利用F11恢复崩溃系统
  16. Forwarding Address字段
  17. 程序员进阶的五个瞬间,开头就笑了!
  18. 微信小程序 springboot农产品在线商城系统java 助农电商
  19. luffy-(12)
  20. 全志平台Android4.0 SOFTAP STATION共存调试记录1

热门文章

  1. 网络安全学习--动态路由RIP
  2. 继续Nginx WRR负载均衡算法的优化
  3. java 创建临时表 oracle_在ORACLE存储过程中创建临时表
  4. 阿里云服务器处理挖矿程序过程
  5. mysql怎么把文字图片保存在一起_如何在数据库中同时保存文本和图片
  6. 几个有名的在线做题系统(ACM OJ)
  7. 第9/9课:敏捷专题讲解【41-47】-科科过PMP
  8. leetcode 超级次方
  9. jq选择器和过滤器总结
  10. grom (一)连接Mysql数据库