cUI 系列 -- 窗口绘制

一、背景

任何 UI 框架的基础能力:显示一幅 “图”。
这幅 “图” 的可能来源:静态图片, 动画帧,解码后的视频帧,亦或是 OSR 模式下 CEF3 渲染进程输出的页面帧等。

二、关键技术

解码

这里给出可选项:

  • WIC: 微软提供的图像编解码框架,支持 BMP, JPEG,PNG, GIF, TIFF, ICO 等;
  • Bitmap (C#): 基于 WIC。但是,仅支持解析 GIF 的第一帧。
  • stb:三方插件,不支持矢量图 svg。
  • skia: 三方插件,完美支持各式资源(位图, 矢量图,动画)。

本示例程序,使用 Bitmap 和 skia 实现了所有图片格式的解码。为侧重于渲染,skia 解码部分已删减。

渲染

这里给出可选项:

  • GDI:底层API, 直接与硬件交互,更接近操作系统;
  • GDI+: GDI 的封装与扩展;
  • Direct2D: 同 opengl 和 vulkan, 充分利用 GPU 资源。考虑到兼容性,此部分会作为 cUI 框架的扩展功能。

本示例程序沿用更底层的 GDI 工具。这里给出 GDI 常用接口:

1
2
3
4
5
6
7
8
9
CreateCompatibleDC() // 创建内存设备上下文

SelectObject() // 选择GDI对象(位图、画笔等)

SetStretchBltMode() // 设置位图拉伸模式,即插值方式

StretchBlt() // 位块传输(拉伸复制)

DeleteDC() // 删除设备上下文

三、参考代码

基础实现

  • 静态图片: 绘制功能;
  • 动态图片: 绘制功能;基于 Timer 的按需刷新及缓存机制。

示例程序

该示例仅包含通用的 win32 接口和标准 thread 接口调用。
点我获取示例程序

四、其他

该系列后续示例程序,将会回归更简洁的开发语言 c/c++。 期待下一篇:桌面通知~


cUI 系列 -- 窗口绘制
https://jalencui.com/2025/10/12/cUI-windowpaint/
Author
Jalen Cui
Posted on
October 12, 2025
Licensed under