- 博客(172)
- 资源 (2)
- 收藏
- 关注
原创 UI Composition 在 Win32 窗口中绘制字体图标
本文介绍如何在Win32应用中通过DraftDepot集成,利用DirectWrite从EXE资源加载自定义字体并构建独立字体集合。通过IDWriteFontSetBuilder1与内存字体加载器,安全加载嵌入的字体文件,生成IDWriteFontCollection1;再遍历字体族名,创建统一小写键的TextFormat映射表,实现多语言名称精准匹配。最终支持按名称获取格式并渲染文本,确保跨平台发布时字体一致性与程序健壮性。
2026-10-21 10:21:50
178
原创 UI Composition 技术在 Win32 窗口中绘制文本
本文详解了使用 Composition 渲染文本的完整流程:先初始化 D3D11 与 D2D 互操作环境,创建共享 GPU 资源的渲染管线;再通过 DWrite 创建文本格式与布局,测量文字实际尺寸;最后生成匹配大小的 GPU 纹理表面,将其作为贴图绘制到 SpriteVisual 上,实现高效、高 DPI 自适应的文本渲染。
2026-10-19 11:37:37
68
原创 UI Composition 技术在传统 Win32 窗口中绘制圆角矩形
本文使用 DraftDepot(稿仓 https://github.com/xland/DraftDepot)编辑并发布,DraftDepot 可以把一篇文章一键发布到多个平台。在学习本文章之前,请先看一下本文章之前的一篇文章。
2026-10-16 09:34:13
194
原创 在传统 Win32 窗口中使用 UI Composition 技术
本文介绍如何使用 WinRT 消息队列与 UI Composition 构建轻量级原生窗口应用。通过 DispatcherQueueController 建立消息循环,桥接原生 HWND 与 Compositor,实现透明背景、无 GDI 重定向的高效渲染。支持动态绘制、布局、动画及透明效果,所有操作无需调用 InvalidateRect,最终可打包为小于 1MB 的单文件可执行程序。后续将深入讲解布局、圆角、文本渲染及与 Yoga 引擎整合等高级功能。
2026-10-13 14:13:59
133
原创 开发邮箱客户端产品的技术选型(.Net)
本文推荐 .NET 开发者使用 MailKit 与 MimeKit 构建邮件客户端。MailKit 兼容性极强,可应对各类邮件服务器的协议怪癖(如 IMAP/SMTP 非标准响应、认证异常等),并内置自动修复机制。MimeKit 则提供严谨的 MIME 解析与构建能力,支持容错解码、TNEF 解封等。二者结合,实现高效、稳定的邮件收发。附带简洁示例代码,快速上手。
2026-10-10 11:13:47
214
原创 开源:一稿多投工具(仅4M,支持9大平台)
DraftDepot 稿仓是一款基于 WebView2 的轻量级一稿多投工具,支持将文章一键发布至微信公众号、知乎、CSDN 等9大技术平台。仅需4MB可执行文件,本地存储、自动保存、富文本编辑与代码高亮功能齐全。通过脚本注入实现跨平台内容填充与图片同步,利用 SQLite 记录已传图片避免重复上传,支持图像智能缩放与本地缓存。所有资源内嵌于单文件,无需依赖外部环境,真正实现“即开即用”。开源地址:https://github.com/xland/DraftDepot
2026-10-04 13:46:11
137
原创 AI 不仅仅埋葬了我的才华
AI编程颠覆了程序员的创作乐趣与职业价值。曾以写代码为乐的我,如今面对AI十分钟完成的任务,只剩机械执行。复杂系统被AI随意重构,代码难以理解,技术专家的核心能力被削弱。未来三年,人机协作仍为主流,但裁员潮已近在眼前。与其焦虑,不如注册一人公司,用AI实现创意,抓住转型机遇。
2026-09-23 11:25:18
169
原创 桌面翻译工具(仅1MB)支持快捷键取词
摘要:开发者推出了一款仅1MB的轻量级桌面翻译工具Translator,支持快捷键取词(默认Ctrl+Alt+T)。该工具需接入百度翻译API(每月100万字符免费额度),自动识别中英文互译。开源项目地址为github.com/xland/Translator,包含设置界面截图展示。工具可智能判断选中文本语言方向(中文→英文,非中文→中文)。
2026-08-22 12:18:27
161
原创 新版本:小巧强大的截图工具ScreenCapture(1MB单exe文件)
ScreenCapture 是一款轻量级 Windows 截图工具,近期迎来多项功能更新:基于自研 Ling GUI 框架重构,新增 OCR 文字识别(需安装 25MB 插件)和二维码识别功能,优化录屏异常问题。界面交互改进包括取消托盘菜单、精简快捷键,支持框选截图后功能入口调整。新增命令行参数 --auto-quit 实现"用完即走",恢复区域调整功能,支持便携模式配置。性能方面优化内存占用 5MB,修复 DPI 缩放定位问题。工具支持滚动截图、屏幕录制(GIF/MP4)、多语言等特性,仅 1MB 单文件
2026-08-13 10:57:58
199
原创 C++ WinRT中的异步
摘要:C++/WinRT是微软提供的现代C++17语言投影,支持Windows运行时异步编程。它通过协程(co_await)简化异步操作,提供IAsyncAction等四种异步类型。关键特性包括线程切换辅助函数(resume_background/foreground)和DispatcherQueue任务调度机制。文章重点介绍了异步编程模式,并警告在UI线程中使用.get()可能导致的死锁问题,建议使用Completed回调或协程方式处理异步结果。
2026-02-19 10:55:45
2032
原创 Skia---常用的颜色过滤器
此方法前两个参数分别是阴影在 x 和 y 方向上的偏移量,第三、四个参数为阴影的模糊半径,第五个参数是阴影的颜色。每一行则对应于输出颜色的一个分量,四行分别是输出颜色的:R、G、B、A。较高的值会产生较小、较精细的噪声,而较低的值会产生较大、较粗糙的噪声,这两个值的取值范围应该在0-1之间。比如,第一行的五个值控制着输出颜色红色分量的值,它由输入颜色的R、G、B、A分量以及一个常数偏移量决定。)将源颜色与目标颜色(图像里的颜色)混合,结果颜色的 Alpha 值取决于源颜色的 Alpha 值。
2025-10-09 15:05:29
1117
原创 Skia如何渲染文本段落
Skia 使用 skparagraph 和 icu 等库来辅助开发者渲染段落文本。skparagraph 是 Skia 提供的一个高级文本布局和绘制工具。它简化了文本排版的过程,使开发者可以更容易地处理复杂的文本布局需求,例如多行文本、自动换行、对齐方式等。icu (International Components for Unicode) 库是一个成熟的、功能全面的国际化开发库,被广泛用于处理 Unicode 文本,比如:字体的布局、文本的形状化、语言断词(用于自动换行)等功能。
2025-09-18 16:31:42
1021
原创 Skia渲染 SVG 矢量图像
类型的图像并不是位图图像,而是矢量图像,它是由数学方程定义的图形,主要由点、线、曲线、形状、颜色组成。由于此方法会被多次执行,不可能每次都去创建字体对象,所以这里用到了局部静态变量以缓存字体对象。位图图像在放大或缩小时可能会丢失图像的细节或出现锯齿,这类文件体积通常较大。矢量图像可以无限放大或缩小而不失真,与分辨率无关,这类文件体积通常较小。时会创建字体对象,以后每次调用,都使用第一次创建并缓存的字体对象。以让出CPU时间片,给子线程让出执行资源,避免忙等待。此对象提供从文件系统加载资源的能力,
2025-09-12 12:52:07
826
原创 Skia如何渲染 Lottie 动画
在渲染动画的每一帧前,必须清空了画布,因为 lottie 动画每一帧都可以独立渲染成一幅图像,如果不做清空工作,则可能和上一帧图像叠加到一起了。循环伊始,首先计算动画的位置和大小,因为用户可能随时调整窗口的大小,所以要在每次循环时都计算它们。值得注意的是,这个方法是在子线程中执行的,是受线程锁保护的,执行这个方法时,永不会执行。这是窗口大小改变时执行的代码,在这段代码中,使用线程锁来保护重置窗口画布数据的工作。渲染动画前先加线程锁,因为这里要修改画布像素数据,这与前面介绍的线程锁是呼应的。
2025-09-06 17:07:09
811
原创 Skia---如何渲染 Gif 动画
动画文件是基于一种压缩算法生成的:如果前一帧中包含的一部分像素与后一帧中包含的像素相同,那么后一帧中即不必存储这些像素,以此减少文件体积。这些图像按照特定的顺序排列,每一帧都代表动画中的一个瞬间,帧图像是支持透明的。动画的第一帧是一个完整的图像,后面每一帧存储的像素都是这一帧与前一帧不同的像素数据,不存在相同的像素数据。如果不是,则设置为下一帧。),窗口重绘时,会在窗口正中间渲染解码得到的图像,重绘完成之后,等待一段时间(指向的内存空间的数据,而且每改变一次(解码一帧),即请求一次窗口重绘。
2025-09-01 16:44:10
673
原创 Skia---如何处理图像(2)
如你所见,Skia 要求你主动告诉它你能提供什么解码器,Skia 这样做可以让应用程序消耗的内存更少,运行速度更快(不必一次性注册那么多图像解码器)。的编码支持,如果要对其他格式的图像进行编码,则需要开发者结合 Skia 提供的能力自行编码完成( Skia 有公开相关接口)。程序确实按照窗口的大小绘制图像了,但绘制的图像失真了,就像图像没有执行抗锯齿处理一样。配置对象,这个对象用于控制图像缩放时如何完成像素采样工作,使用这个对象的默认值。用这个矩形对象来约束图像的位置和大小,让图像布满整个窗口。
2025-08-23 10:24:20
1058
原创 Skia---如何解码图像
Skia 提供了从不同的图像文件类型中解码数据的能力。除了解码流行的静态图像文件格式(pngjpegwebpbmp等)外, 还提供了解码动态图像文件的能力。
2025-08-11 15:29:30
1147
原创 Skia-如何渲染文本(下)
字体图标在前端开发中非常普遍,HTML 能渲染字体图标,Skia 当然也可以(显而易见)。使用系统字体最大的好处就是内存占用少,因为系统已经加载了那些字体,应用程序只不过是复用系统加载的字体文件,不会占用额外的内存。有的时候使用 Skia 绘制文本或字体图标时,你会发现文本或字体图标与正常网页中的表现不一致,比如:有的时候,已经在程序的其他地方读取了字体文件的数据,直接使用自己的数据来创建。类型的变量来存储文件路径,就不用这么麻烦的来对字符串进行转码操作了。类型的对象,这个对象负责管理字体文件的数据。
2025-08-05 11:28:54
847
原创 Skia-如何渲染文本(上)
编码即可以用来绘制英文,又可以用来绘制中文,甚或中英文混杂的字符串,所以兼容性更好,虽然多占用一些内存,一般也会优先使用这种方式绘制字符串。有些字体文件不支持中文,所以当你把编码方式和文本长度都设置好之后,仍然无法绘制中文文本时,那就要看是不是选择了错误的字体了。,这个对象可以查找 并使用 Windows 系统上的字体,也可以通过字体文件创建字体(这一点我们后文会介绍)。有了它之后,我们就可以创建字体对象了(对应的字体为:微软雅黑)。方法的第一个参数为被绘制的字符串,第二个和第三个参数为文本绘制的位置。
2025-08-01 12:01:13
1216
原创 SkSurface---像素的容器:表面
如果说SkCanvas是画布,是所有绘图操作的提供者的话,那么SkSurface就是画布的容器,我们称之为表面,它负责管理画布对应的像素数据。这些像素数据可以是在内存中创建的,也可以是在 GPU 显存中创建的。
2025-07-29 09:57:49
1060
原创 Skia 的核心类---画布SkCanvas(下)
在上一篇中介绍了SkCanvas的基本操作,如果SkCanvas就只有这些能力的话,那它也称不上 Skia 最重要的类型之一了,本文将在上一篇的基础上继续介绍SkCanvas的高级操作。
2025-07-23 10:57:41
757
原创 Skia 的核心类---深入画布SkCanvas (上)
SkCanvas 是 Skia 的核心类之一,我们可以把它看作画布,它提供了用于绘制图形的接口。
2025-07-18 16:18:03
1133
原创 如何解决 Windows 11首次启动 exe 慢的问题
我遇到的问题是:生成 exe 文件很快,但启动这个 exe 却很慢(大概要等半分钟)。如果我不改代码,直接启动这个 exe 又很快。也就是说,只有首次启动启动 exe 慢。每次调试程序的时候 Visual Studio 都会帮我重新生成 exe 文件。这个问题只出现在 Windows 11 上,Windows 10 没这个问题。日常工作就是用 Visual Studio 开发桌面应用。改完之后,再次调试程序,一切都变得飞快了。我是一个桌面端开发工程师。
2025-07-17 11:54:45
657
原创 Skia---渐变色着色器
今天介绍的是实际工作中最常用到的着色器:渐变色着色器。渐变色着色器是一个从一种颜色平滑的过渡到另一种颜色的效果,渐变色着色器的作用主要是增强图形的视觉吸引力。
2025-07-11 12:06:17
706
原创 在浏览器中使用SQLite(官方sqlite3.wasm)
摘要:本文建议避免使用sqlite-wasm工具,推荐直接使用官方SQLite WebAssembly版本。通过下载jswasm目录文件并引入sqlite3-worker1-promiser.js脚本,封装了一个TypeScript类Db来操作SQLite数据库。重点介绍了如何利用OPFS文件系统(浏览器私有高性能存储)创建和管理数据库,包括建表检查和数据查询方法。文章还说明了SQL指令执行的回调机制,以及如何删除数据库文件。该方法提供了浏览器端持久化存储的解决方案。
2025-07-04 10:37:54
1244
原创 使用 UI 合成器(UI::Composition)集成 WebView2
本文介绍了两种集成WebView2的方法:传统子窗口方式和UI合成器方式。传统方法存在窗口层级管理和鼠标事件处理的局限性,而UI合成器方案则能更好地控制WebView2渲染内容,支持旋转、缩放等效果。文章详细说明了如何使用UI合成器创建WebView2控件,包括Compositor初始化、控件创建、内容合成以及鼠标事件转发等关键步骤。通过该方案,WebView2内容可无缝融入窗口界面,但需要开发者手动处理鼠标事件转发和光标变化。作者提供了简化代码示例,并推荐参考其开源项目HorseJs获取完整实现。
2025-07-01 11:38:35
766
原创 Qt6 如何在一个视频上放置一个按钮
摘要:在Qt6中使用QVideoWidget创建视频播放器时,由于硬件加速导致无法直接在视频上叠加按钮控件。解决方案是改用QGraphicsVideoItem结合QGraphicsView和QGraphicsScene系统。通过创建QGraphicsView场景,将视频作为QGraphicsVideoItem添加,同时可以自由添加按钮等控件到同一场景中。这种方法解决了硬件加速渲染带来的控件叠加问题,实现视频和按钮的完美分层显示。代码示例展示了如何构建视频播放器并添加圆形透明按钮控件。
2025-06-26 15:00:06
393
原创 为 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
444
原创 如何静态链接 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
521
原创 SQLite官方数据库加密方案
由于要查询历史消息,所以聊天数据都得落地(从服务器访问慢,且服务器压力大)。它只对数据库文件加密。也就是说,如果客户端内存暴露了,那数据还是不安全的,但这已经足够了。(如果你的客户端有两个数据库,一个加密,一个未加密,你不用集成两套。不过在打开数据库之后,你应该马上传入密钥,才能访问加密的数据库。但谁也不知道历史消息里哪句话是敏感的,哪句话是不敏感的。值得一提的是,你可以使用编译的程序,访问未加密的数据库。假设你交了钱之后,拿到了代码,编译成了动态链接库,中读取加密的内容(读到内存中的是明文),
2025-06-16 13:47:25
1141
原创 单 exe 截图软件:ScreenCapture 2.3.1 发布
218626.018.0Enter200006.9.1ScreenCapture 截图工具 体积小(8M 左右)、仅一个可执行文件,无需安装,不依赖任何动态链接库。运行速度快、内存占用低、CPU 使用率低。
2025-06-13 13:54:21
1033
原创 Skia---无所不能的路径
Skia 里的路径(SkPath)通常是由一系列点连接而成,可以是闭合的面,也可以不是,点和点之间的连线可以是直线也可以是曲线(圆弧或者贝塞尔曲线等),甚至一个路径里可以拥有多个闭合的面。可以说。
2025-06-11 13:06:22
771
原创 Skia如何绘制几何图形
应用程序(网页、桌面应用或移动应用)大多数都是由基本的几何图形构成的。那我们该如何使用 Skia 绘制基本的几何图形。drawRect 方法负责在窗口中绘制矩形。窗口重绘时执行 paint 方法,在此方法中,把画布指针传递给 drawRect 方法,让 drawRect方法在窗口中绘制矩形。非填充绘图对象。默认情况下绘图对象 SkPaint 为填充状态,当执行 paint.setStroke(true) 代码后,绘图对象就变成了非填充状态。绘图对象的 setStrokeWidth 方法,用于设置边框粗细。
2025-06-06 14:50:17
1342
原创 开源推荐:从源代码构建Qt的二进制版本
开源项目 buildQt 提供了预编译的Qt5/Qt6二进制文件,支持MSVC、MinGW64和LLVM-MinGW三大编译器,包含静态和动态链接库,适用于Windows64位平台。该项目提供精简版和完整版两种选项,使用GitHub Action自动构建,帮助开发者节省大量编译时间。注意使用时需确保Visual Studio版本不低于作者标注的版本。作者yuanpeirong的无私贡献极大便利了Qt开发者使用体验。
2025-06-03 14:41:21
252
原创 不用模板,让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
269
Electron包安装过程解析pdf
2020-10-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅