自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

liulun的博客

风雪夜归人

  • 博客(154)
  • 资源 (2)
  • 收藏
  • 关注

原创 Skia---如何渲染 Gif 动画

动画文件是基于一种压缩算法生成的:如果前一帧中包含的一部分像素与后一帧中包含的像素相同,那么后一帧中即不必存储这些像素,以此减少文件体积。这些图像按照特定的顺序排列,每一帧都代表动画中的一个瞬间,帧图像是支持透明的。动画的第一帧是一个完整的图像,后面每一帧存储的像素都是这一帧与前一帧不同的像素数据,不存在相同的像素数据。如果不是,则设置为下一帧。),窗口重绘时,会在窗口正中间渲染解码得到的图像,重绘完成之后,等待一段时间(指向的内存空间的数据,而且每改变一次(解码一帧),即请求一次窗口重绘。

2025-09-01 16:44:10 465

原创 Skia---如何处理图像(2)

如你所见,Skia 要求你主动告诉它你能提供什么解码器,Skia 这样做可以让应用程序消耗的内存更少,运行速度更快(不必一次性注册那么多图像解码器)。的编码支持,如果要对其他格式的图像进行编码,则需要开发者结合 Skia 提供的能力自行编码完成( Skia 有公开相关接口)。程序确实按照窗口的大小绘制图像了,但绘制的图像失真了,就像图像没有执行抗锯齿处理一样。配置对象,这个对象用于控制图像缩放时如何完成像素采样工作,使用这个对象的默认值。用这个矩形对象来约束图像的位置和大小,让图像布满整个窗口。

2025-08-23 10:24:20 965

原创 Skia---如何解码图像

Skia 提供了从不同的图像文件类型中解码数据的能力。除了解码流行的静态图像文件格式(pngjpegwebpbmp等)外, 还提供了解码动态图像文件的能力。

2025-08-11 15:29:30 999

原创 Skia-如何渲染文本(下)

字体图标在前端开发中非常普遍,HTML 能渲染字体图标,Skia 当然也可以(显而易见)。使用系统字体最大的好处就是内存占用少,因为系统已经加载了那些字体,应用程序只不过是复用系统加载的字体文件,不会占用额外的内存。有的时候使用 Skia 绘制文本或字体图标时,你会发现文本或字体图标与正常网页中的表现不一致,比如:有的时候,已经在程序的其他地方读取了字体文件的数据,直接使用自己的数据来创建。类型的变量来存储文件路径,就不用这么麻烦的来对字符串进行转码操作了。类型的对象,这个对象负责管理字体文件的数据。

2025-08-05 11:28:54 692

原创 Skia-如何渲染文本(上)

编码即可以用来绘制英文,又可以用来绘制中文,甚或中英文混杂的字符串,所以兼容性更好,虽然多占用一些内存,一般也会优先使用这种方式绘制字符串。有些字体文件不支持中文,所以当你把编码方式和文本长度都设置好之后,仍然无法绘制中文文本时,那就要看是不是选择了错误的字体了。,这个对象可以查找 并使用 Windows 系统上的字体,也可以通过字体文件创建字体(这一点我们后文会介绍)。有了它之后,我们就可以创建字体对象了(对应的字体为:微软雅黑)。方法的第一个参数为被绘制的字符串,第二个和第三个参数为文本绘制的位置。

2025-08-01 12:01:13 1043

原创 SkSurface---像素的容器:表面

如果说SkCanvas是画布,是所有绘图操作的提供者的话,那么SkSurface就是画布的容器,我们称之为表面,它负责管理画布对应的像素数据。这些像素数据可以是在内存中创建的,也可以是在 GPU 显存中创建的。

2025-07-29 09:57:49 920

原创 Skia 的核心类---画布SkCanvas(下)

在上一篇中介绍了SkCanvas的基本操作,如果SkCanvas就只有这些能力的话,那它也称不上 Skia 最重要的类型之一了,本文将在上一篇的基础上继续介绍SkCanvas的高级操作。

2025-07-23 10:57:41 595

原创 Skia 的核心类---深入画布SkCanvas (上)

SkCanvas 是 Skia 的核心类之一,我们可以把它看作画布,它提供了用于绘制图形的接口。

2025-07-18 16:18:03 946

原创 如何解决 Windows 11首次启动 exe 慢的问题

我遇到的问题是:生成 exe 文件很快,但启动这个 exe 却很慢(大概要等半分钟)。如果我不改代码,直接启动这个 exe 又很快。也就是说,只有首次启动启动 exe 慢。每次调试程序的时候 Visual Studio 都会帮我重新生成 exe 文件。这个问题只出现在 Windows 11 上,Windows 10 没这个问题。日常工作就是用 Visual Studio 开发桌面应用。改完之后,再次调试程序,一切都变得飞快了。我是一个桌面端开发工程师。

2025-07-17 11:54:45 185

原创 Skia---渐变色着色器

今天介绍的是实际工作中最常用到的着色器:渐变色着色器。渐变色着色器是一个从一种颜色平滑的过渡到另一种颜色的效果,渐变色着色器的作用主要是增强图形的视觉吸引力。

2025-07-11 12:06:17 588

原创 在浏览器中使用SQLite(官方sqlite3.wasm)

摘要:本文建议避免使用sqlite-wasm工具,推荐直接使用官方SQLite WebAssembly版本。通过下载jswasm目录文件并引入sqlite3-worker1-promiser.js脚本,封装了一个TypeScript类Db来操作SQLite数据库。重点介绍了如何利用OPFS文件系统(浏览器私有高性能存储)创建和管理数据库,包括建表检查和数据查询方法。文章还说明了SQL指令执行的回调机制,以及如何删除数据库文件。该方法提供了浏览器端持久化存储的解决方案。

2025-07-04 10:37:54 849

原创 使用 UI 合成器(UI::Composition)集成 WebView2

本文介绍了两种集成WebView2的方法:传统子窗口方式和UI合成器方式。传统方法存在窗口层级管理和鼠标事件处理的局限性,而UI合成器方案则能更好地控制WebView2渲染内容,支持旋转、缩放等效果。文章详细说明了如何使用UI合成器创建WebView2控件,包括Compositor初始化、控件创建、内容合成以及鼠标事件转发等关键步骤。通过该方案,WebView2内容可无缝融入窗口界面,但需要开发者手动处理鼠标事件转发和光标变化。作者提供了简化代码示例,并推荐参考其开源项目HorseJs获取完整实现。

2025-07-01 11:38:35 627

原创 Qt6 如何在一个视频上放置一个按钮

摘要:在Qt6中使用QVideoWidget创建视频播放器时,由于硬件加速导致无法直接在视频上叠加按钮控件。解决方案是改用QGraphicsVideoItem结合QGraphicsView和QGraphicsScene系统。通过创建QGraphicsView场景,将视频作为QGraphicsVideoItem添加,同时可以自由添加按钮等控件到同一场景中。这种方法解决了硬件加速渲染带来的控件叠加问题,实现视频和按钮的完美分层显示。代码示例展示了如何构建视频播放器并添加圆形透明按钮控件。

2025-06-26 15:00:06 277

原创 为 Visual Studio 工程设置预编译头

摘要:预编译头(PCH)是优化C/C++项目编译速度的技术,通过预先编译常用且不常修改的头文件。在VisualStudio中设置PCH需:1)配置工程属性;2)创建pch.h(包含常用头文件)和pch.cpp(仅包含pch.h);3)为每个cpp文件首行添加#include"pch.h"。该方法能避免重复解析头文件,显著提升编译速度,减少手动错误。现代VS工程推荐使用pch.h命名而非传统的stdafx.h。

2025-06-23 10:13:49 242

原创 如何静态链接 WebView2 的 WebView2Loader 库

摘要:通过修改WebView2组件安装目录下的Common.targets文件(约103行),将WebView2LoaderPreference参数从"Dynamic"改为"Static",可实现应用程序对WebView2Loader.dll的静态链接,消除运行时依赖。此设置在WebView2版本升级后需重新配置。操作路径为:packages\Microsoft.Web.WebView2.{版本号}\build\Common.targets。(149字)

2025-06-19 12:28:42 284

原创 SQLite官方数据库加密方案

由于要查询历史消息,所以聊天数据都得落地(从服务器访问慢,且服务器压力大)。它只对数据库文件加密。也就是说,如果客户端内存暴露了,那数据还是不安全的,但这已经足够了。(如果你的客户端有两个数据库,一个加密,一个未加密,你不用集成两套。不过在打开数据库之后,你应该马上传入密钥,才能访问加密的数据库。但谁也不知道历史消息里哪句话是敏感的,哪句话是不敏感的。值得一提的是,你可以使用编译的程序,访问未加密的数据库。假设你交了钱之后,拿到了代码,编译成了动态链接库,中读取加密的内容(读到内存中的是明文),

2025-06-16 13:47:25 731

原创 单 exe 截图软件:ScreenCapture 2.3.1 发布

218626.018.0Enter200006.9.1ScreenCapture 截图工具 体积小(8M 左右)、仅一个可执行文件,无需安装,不依赖任何动态链接库。运行速度快、内存占用低、CPU 使用率低。

2025-06-13 13:54:21 746

原创 Skia---无所不能的路径

Skia 里的路径(SkPath)通常是由一系列点连接而成,可以是闭合的面,也可以不是,点和点之间的连线可以是直线也可以是曲线(圆弧或者贝塞尔曲线等),甚至一个路径里可以拥有多个闭合的面。可以说。

2025-06-11 13:06:22 609

原创 玩转 Skia 的颜色

skia

2025-06-09 13:17:06 1198

原创 Skia如何绘制几何图形

应用程序(网页、桌面应用或移动应用)大多数都是由基本的几何图形构成的。那我们该如何使用 Skia 绘制基本的几何图形。drawRect 方法负责在窗口中绘制矩形。窗口重绘时执行 paint 方法,在此方法中,把画布指针传递给 drawRect 方法,让 drawRect方法在窗口中绘制矩形。非填充绘图对象。默认情况下绘图对象 SkPaint 为填充状态,当执行 paint.setStroke(true) 代码后,绘图对象就变成了非填充状态。绘图对象的 setStrokeWidth 方法,用于设置边框粗细。

2025-06-06 14:50:17 1116

原创 开源推荐:从源代码构建Qt的二进制版本

开源项目 buildQt 提供了预编译的Qt5/Qt6二进制文件,支持MSVC、MinGW64和LLVM-MinGW三大编译器,包含静态和动态链接库,适用于Windows64位平台。该项目提供精简版和完整版两种选项,使用GitHub Action自动构建,帮助开发者节省大量编译时间。注意使用时需确保Visual Studio版本不低于作者标注的版本。作者yuanpeirong的无私贡献极大便利了Qt开发者使用体验。

2025-06-03 14:41:21 160

原创 不用模板,让C++方法接收可变数量的参数

文章摘要:本文介绍了C++中可变参数函数的实现方法。通过#include<cstdarg>头文件,使用va_list、va_start、va_arg和va_end宏处理可变参数。示例展示了两种实现方式:直接获取参数和参数列表转发。关键点包括:必须用va_end清理、参数数量由count指定、类型安全需自行保证。典型应用如处理窗口事件时传递x,y,w,h坐标参数,其中4表示参数个数。这种方法为处理不定数量参数提供了灵活方案,但需注意正确使用宏确保资源释放。

2025-05-30 14:28:32 222

原创 让Qt窗口覆盖整个桌面区域(支持多屏幕桌面)

第一:窗口必须是自定义 QMainWindow ,不能是 QWidget,用QWidget是有问题的。第二:方法中最后五行代码必须按顺序执行,不按这个顺序会有问题。

2025-05-28 12:29:55 307

原创 获取鼠标所在位置的窗口,再根据窗口句柄获取应用程序路径

该代码片段用于获取当前鼠标光标所在窗口的进程名称。首先,通过GetCursorPos获取鼠标位置,然后使用WindowFromPoint获取该位置对应的窗口句柄。接着,通过GetWindowThreadProcessId获取窗口所属的进程ID,并使用OpenProcess打开该进程。最后,通过GetModuleFileNameEx获取进程的可执行文件路径并输出。代码中使用了Qt的qDebug进行日志输出,但可以移除以消除对Qt的依赖。整体代码简洁,功能明确,适用于获取窗口进程信息的场景。

2025-05-26 09:49:14 231

原创 Qt5.x升级6.x应注意http请求头大小写的问题

在Qt中发起HTTP请求时,Qt 5.x和Qt 6.x在处理请求头时存在差异。Qt 5.x会原封不动地发送开发者设置的请求头,而Qt 6.x会将请求头的名称转换为小写后再发送。根据HTTP协议,请求头名称是不区分大小写的,且应默认统一为小写。Java后端在处理HTTP请求时,对请求头名称的大小写不敏感,而某些Python Web框架(如Flask)则对大小写敏感。目前,无法禁止Qt 6.x将请求头名称转换为小写,只能通过调整服务端代码来适配这一变化。

2025-05-23 11:28:22 442

原创 Skia如何在窗口上绘图

WM_PAINT消息 当系统需要重绘窗口时,会向窗口发送 WM_PAINT 消息, 比如窗口大小改变或应用程序内调用InvalidateRect系统API(强制重绘窗口)时,系统都会向窗口发送WM_PAINT 消息。窗口创建成功后,窗口的消息处理函数会陆续收到与窗口有关的消息,比如窗口大小调整消息(WM_SIZE), 窗口重绘消息(WM_PAINT)等。改变窗口大小会更新全局变量 w 和 h ,会触发窗口的重绘消息,会重新执行paint方法,重新创建像素数组,重新在窗口右下角绘制矩形。

2025-05-22 13:51:49 593

原创 桌面端截长图/滚动截图:图像融合拼接关键算法

文章摘要:本文介绍了在窗口滚动前后,通过图像处理技术实现图像拼接的关键步骤。首先,在滚动前后分别对窗口进行截图,然后通过OpenCV或自研算法找到两个子图像的相似区域。OpenCV算法通过模板匹配找到最佳匹配位置,而自研算法则利用多线程计算误差,找到最小误差的匹配区域。最终,通过确定相似区域的位置,实现两个图像的拼接。文章强调,不应通过计算鼠标滚轮滚动的高度来确定窗口内容的变化,因为不同窗口的行进高度可能不同。

2025-05-16 13:53:08 363

原创 Qt6.x检查网络是否在线(与Qt 5.x不同)

Qt 6.x.x 废弃了 QNetworkConfigurationManager,此时要判断客户端网络是否联通需要使用:QNetworkInformation。

2025-05-09 14:16:23 537

原创 C++ 如何在一个方法中返回多个不同类型的数据

int number;return 0;这种方法就更麻烦了,不过要返回很多数据时,这个方法能更清晰的表意。

2025-05-07 13:15:06 303

原创 【自荐】体积小,速度快,对开发、测试人员友好的截图软件

ScreenCapture 截图工具、仅一个可执行文件,无需安装,不依赖任何。运行速度快、内存占用低、CPU 使用率低。

2025-05-06 10:21:12 397

原创 使用zxing-cpp生成与识别二维码(支持中文)

使用zxing-cpp生成与识别二维码(支持中文)

2025-05-02 11:34:16 483

原创 Windows 遍历桌面上的窗口,得到窗口矩形(修正矩形间隙)

【代码】Windows 遍历桌面上的窗口,得到窗口矩形(修正矩形间隙)

2025-04-18 14:31:11 157

原创 Qt 仅绘制半个像素的边框(现象及解决方案)

也就是说,你必须明确告诉Qt,你想绘制0.5像素的边框,而且你绘制的内容会在你的画布上。边框粗细也会跟着变大,但虽然设置的边框粗细是6,实际看到的也只有3个像素的宽度。虽然我们设置了边框粗细为1像素,但实际上绘制的这个矩形的边框只有0.5像素。你仔细看的话,会发现上图右侧边框已变得粗一些了。这是无论你怎么拖动改变窗口大小,边框也不会消失。这个现象其实很容易理解,我就不总结了。(并不是所有时候都会被忽略)当我们把边框粗细调大。

2025-04-11 14:52:46 202

原创 把一个半透明窗口嵌入Windows桌面并转发系统鼠标消息到窗口

当窗口嵌入桌面时,Qt的事件处理机制是接不到鼠标消息的,你只能在onEmbed....方法中手动处理。现在这个窗口的所有消息都会被转发到 WNDPROC oldProc;把窗口从嵌入状态恢复为非嵌入状态,最简单的办法就是把这个窗口关了,重新创建一个。当窗口未嵌入桌面时,不应该注册输入设备。窗口在桌面背景前面,在桌面图标后面。

2025-04-10 08:27:00 243

原创 Windows注册鼠标钩子,获取用户选中的文本

上述代码中MouseProc方法用于处理系统的鼠标消息。

2025-04-07 17:14:35 591

原创 Qt在高分屏下播放gif动画模糊问题的解决方案(支持gif缩放)

然而用这种方案在高分屏下播放 gif 动画会导致动画模糊。

2025-04-01 09:27:34 285

原创 轻量级 Qt无边框、带阴影、可变大小窗口方案(Windows)

这个消息主要是用于让窗口聚焦,不然 在最小化窗口后再通过点击任务栏,显示窗口,此时鼠标移入 setSystemButton 设置的组件(自定义 QWidget ),无法触发此组件的 enterEvent。这段代码用于设置窗口位置、大小,并显示窗口,注意,必须等设置完阴影效果,移除边框之后,才能设置窗口大小并显示。这段代码用于设置窗口最大化的尺寸,避免窗口最大化时,把任务栏都盖住了。这段代码鼠标双击自定义标题栏区域时,切换窗口最大化,最小化的状态。这段代码用于在窗口最大化状态切换时改变最大化按钮图标。

2025-03-28 11:40:06 495 4

原创 Qt窗口最大化后无法还原的问题及解决方案

这是 Qt 在无边框窗口 (Qt::FramelessWindowHint) 下的一个已知问题。无边框窗口在 showMaximized() 后,由于缺少标准的窗口管理机制,Qt 无法正确地恢复窗口大小。此方案原理就是把窗口的FramelessWindowHint属性拿掉,再改变窗口的大小,再把FramelessWindowHint窗口属性加回去。值得注意的是,setWindowFlags() 之后需要 show() 以应用更改,否则窗口可能不会更新。都不能改变窗口的大小。

2025-03-26 12:31:45 281

原创 Qt把图像写入剪切板会导致内存泄漏的解决方案

Qt把图像写入剪切板会导致内存泄漏的解决方案

2025-03-21 11:07:12 186

原创 系统API得到的屏幕坐标与Qt得到的屏幕坐标不一致,怎么办?

在获取鼠标屏幕坐标时,系统API和Qt API在高分屏下会得到不一致的结果,因为Qt的坐标考虑了屏幕缩放比例。系统API使用GetCursorPos获取坐标,而Qt使用QCursor::pos。为了将系统坐标转换为Qt坐标,可以使用getQtPoint函数,该函数通过MonitorFromPoint和GetDpiForMonitor获取屏幕的DPI缩放比例,并将系统坐标除以缩放比例得到Qt坐标。然而,如果坐标不在屏幕上,转换可能会出现问题。

2025-03-19 14:51:55 255

Electron包安装过程解析pdf

本文详细讲解了Electron依赖包被安装到项目中所经历的各个环节,并详细介绍了Electron依赖包对二进制可执行文件的缓存机制以及版本控制原则。

2020-10-27

ASP_NET服务器控件与组件开发

ASP_NET服务器控件与组件开发,说的很详细 有很好的模型图,外国人写的

2008-10-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除