UI Composition 技术在传统 Win32 窗口中绘制圆角矩形

简介: 本文介绍如何使用WinUI的Composition API高效绘制圆角矩形及带边框的圆角矩形,涵盖几何裁剪、DPI适配、描边居中原理与“内缩+外推”实现技巧,代码简洁且性能优于XAML。

本文使用 DraftDepot(稿仓 https://github.com/xland/DraftDepot)编辑并发布,DraftDepot 可以把一篇文章一键发布到多个平台。

在学习本文章之前,请先看一下本文章之前的一篇文章

圆角矩形

如果是绘制一些简单的图形

那么 UI Composition 就提供了对应的组件对象,比如圆角,如下代码所示:

//winrt::Windows::UI::Composition::CompositionRoundedRectangleGeometry clipGeo{ nullptr };
clipGeo = win->compositor.CreateRoundedRectangleGeometry();
visual.Clip(win->compositor.CreateGeometricClip(clipGeo));
//cornerRadius是圆角半径
//win->dpi是当前窗口的缩放比率,确保圆角在不同分辨率下视觉大小一致。
//w和h是visual的尺寸,当控件尺寸小于圆角直径时,自动将圆角半径缩小为宽/高的一半。
const float r = std::min({
    cornerRadius * win->dpi, w * 0.5f, h * 0.5f });
clipGeo.Size({
    w, h });
clipGeo.CornerRadius({
    r, r });

上面的代码把一个 CompositionRoundedRectangleGeometry 对象挂到了 visual 上,背景和 visual 会一起被裁剪。

(创建一个几何裁剪区域,应用到目标 visual 上,使其超出圆角矩形的部分被隐藏。)

CreateGeometricClip:相比普通的矩形裁剪,支持任意几何形状,性能优于 XAML 的 CornerRadius 属性

如果你的visual有背景色,那么这个时候你就能看到一个有背景色的圆角矩形了

winrt::Windows::UI::Color color = winrt::Windows::UI::ColorHelper::FromArgb(a, r, g, b);
visual.Brush(win->compositor.CreateColorBrush(color));

圆角矩形的边框

如果你想为圆角矩形绘制边框,那么就在上述代码的基础上增加如下代码逻辑:

// winrt::Windows::UI::Composition::ShapeVisual borderVisual{ nullptr };
// winrt::Windows::UI::Composition::CompositionRoundedRectangleGeometry borderGeo{ nullptr };
// winrt::Windows::UI::Composition::CompositionSpriteShape borderShape{ nullptr };

borderVisual = win->compositor.CreateShapeVisual();
borderGeo = win->compositor.CreateRoundedRectangleGeometry();
borderShape = win->compositor.CreateSpriteShape(borderGeo);
borderShape.StrokeBrush(win->compositor.CreateColorBrush(borderColor.getUIColor()));
borderVisual.Shapes().Append(borderShape);
// 顶层:保证边框盖在所有子节点之上
visual.Children().InsertAtTop(borderVisual);

const float bw = borderWidth * win->dpi;
const float inset = bw * 0.5f;
// stroke 以路径为中线双向扩散,路径内缩 bw/2 才能让外沿贴 (0,0)-(w,h)
borderVisual.Size({
    w, h });
borderVisual.Offset({
    0.f, 0.f, 0.f });
// Geometry 无 Offset 属性,把位移写在 Shape 上(CompositionShape.Offset)
borderShape.Offset({
    inset, inset });
borderGeo.Size({
    std::max(0.f, w - bw), std::max(0.f, h - bw) });
// 圆角边框:外圆角 = cornerRadius,描边中线半径 = outerR - bw/2
const float outerR = std::min({
    cornerRadius * win->dpi, w * 0.5f, h * 0.5f });
const float midR = std::max(0.f, outerR - inset);
borderGeo.CornerRadius({
    midR, midR });
borderShape.StrokeThickness(bw);

这段代码中:

ShapeVisual: 相当于一个轻量级的“画布”,负责管理变换(Offset/Size)和子图形列表。通过 InsertAtTop 确保边框始终覆盖在内容之上。

CompositionSpriteShape: 相当于“画笔设置”。它持有 Geometry 的引用,并定义了描边颜色 (StrokeBrush)、线宽 (StrokeThickness) 以及形状级别的偏移 (Offset)。

CompositionRoundedRectangleGeometry: 相当于“路径数据”。只关心纯粹的几何尺寸和圆角半径,不包含任何渲染样式。

Composition API(以及大多数底层图形 API)的描边是以几何路径为中心线向两侧等宽扩散的。如果直接将 Geometry 设为 (w, h),描边的一半会溢出到 Visual 外部被裁切,导致视觉上线宽只有设定值的一半。

代码通过 “几何内缩 + 形状外推” 解决了这个问题:

  1. 计算物理线宽:bw = borderWidth * win->dpi   将逻辑像素转换为物理像素,保证高 DPI 下线条不模糊
  2. 计算内缩量:inset = bw * 0.5f 描边向外扩散的距离正好是半线宽
  3. 形状外推:borderShape.Offset({ inset, inset })      Geometry 本身没有 Offset 属性,所以把位移加在 Shape 上,将缩小的路径“推回”到正确位置
  4. 几何内缩:borderGeo.Size({ w - bw, h - bw })  宽高各减去一个完整线宽,使路径外沿+半线宽正好等于 (w, h)
  5. 圆角修正:midR = outerR - inset   外圆角减去半线宽 = 描边中线的实际圆角半径,保证内外圆弧同心

此时你就能看到圆角矩形的边框了。

绘制文本是另一节的内容,我们以后再介绍。

目录
相关文章
|
2天前
|
云安全 人工智能 运维
当攻击全面Agent化,你的安全防御能否跟上AI Speed?
多起客户侧AK泄露事件应急的真实观察
1199 1
|
25天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
9587 32
|
11天前
|
存储 人工智能 并行计算
大模型本地部署终端选型方法论:以 Qwen3.8-27B 为例的四档分层完整流程
本文提出一套大模型本地部署终端选型方法论:定约束、定档位、定框架、定参数四步决策法,配合入门、主力、质量、无损四档分层模型。以 Qwen3.8-27B 实测数据为例,逐环节解读显存、带宽、存储、散热、系统、预算等要素,给出面向不同预算的优选方案、决策自查清单与市场观察框架。文末前瞻 AI 笔记本的 CPU+GPU 与统一内存两条路线,论证四步决策法在新品类上的延续性。
|
10天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型深度拆解:原理解读、实战测评与保姆级落地教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为**System One Model(系统一模型)**,对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
787 1
|
6天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型全解析:核心原理拆解,性能实战测评与落地部署教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为System One Model(系统一模型),对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
522 0
|
23天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
2605 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
7天前
|
存储 人工智能 自然语言处理
千问办公官网入口链接在哪?2026年最新QwenWork测评、千问办公怎么样?一文看懂
千问办公(QwenWork)是阿里云推出的AI智能办公平台,提供网页端和阿里云官网双入口。支持PPT/Word/Excel生成、多模态处理、网页全栈搭建、钉钉深度集成等6大核心能力。个人版免费可用,高级版198元/月;企业版198元/人/月。新用户注册即赠2000积分。阿里千问办公QwenWork官网:https://t.aliyun.com/U/0VCTGt 阿里AI工作平台,一句话完成数据分析、PPT 生成、视频剪辑、网页搭建等复杂任务
1013 0
|
17天前
|
Windows
【保姆级】.NET Framework 3.5离线安装教程(2026最新实测)
.NET Framework 3.5是微软经典运行库,专为兼容老软件、老游戏设计。Win7自带,Win10/11需手动启用(在线或离线安装)。它与4.x系列并存不冲突,缺它会导致“找不到组件”报错。本文详解两种安装方式及常见问题解决,小白也能轻松上手。(239字)
2205 0

热门文章

最新文章