当前位置:网站首页>win10 uwp win2d 使用 Path 绘制界面
win10 uwp win2d 使用 Path 绘制界面
2022-08-04 18:37:00 【林德熙】
本文告诉大家如何在 Win2d 使用 Path 路径绘图
CanvasGeometry
在 win2d ,可以使用 DrawGeometry 的方式画出几何。而路径 Path 就是一种 Geometry 。传入的 CanvasGeometry 参数是不能通过实例创建,需要使用静态工厂创建。
通过 CanvasGeometry.CreatePath 就可以创建出路径几何,通过告诉线条颜色和线条宽度就可以画出 Path ,这个方法只能画出线条。
如果需要填充 Path 需要使用 FillGeometry 方法。
CanvasPathBuilder
因为 CanvasGeometry.CreatePath 的参数是 CanvasPathBuilder ,而 Path 也需要告诉每个点是如何画,所以需要 CanvasPathBuilder 来告诉 Path 每个点是怎么画。
在创建 CanvasPathBuilder 的时候需要传入 ICanvasResourceCreator ,也就是通过 args.DrawingSession 可以创建 CanvasPathBuilder 来画。
using (var canvasPathBuilder = new CanvasPathBuilder(args.DrawingSession))上面的代码是写在 Canvas_OnDraw
private void Canvas_OnDraw(CanvasControl sender, CanvasDrawEventArgs args)
{
using (var canvasPathBuilder = new CanvasPathBuilder(args.DrawingSession))
{
// 这里可以画出 Path 或写出文字 lindexi.github.io
}
}因为Path 可以使用多个 Path 组合,如果需要新建一个 Path 需要调用 BeginFigure 告诉 win2d 开始画出一个新的图形。在图形画完需要调用 EndFigure 告诉 win2d 已经画完。
例如准备画一条线,需要在开始画的时候调用 BeginFigure 告诉起点,在结束的时候使用 EndFigure 并且告诉这是不是封闭图形。
using (var canvasPathBuilder = new CanvasPathBuilder(args.DrawingSession))
{
// 这里可以画出 Path 或写出文字 lindexi.github.io
canvasPathBuilder.BeginFigure(100,100);
canvasPathBuilder.AddLine(200,100);
canvasPathBuilder.EndFigure(CanvasFigureLoop.Open);
}现在运行代码会发现没有画出图形,因为没有调用画出来。调用 DrawGeometry 需要传入需要画的几何、线条颜色,线条宽度
using (var canvasPathBuilder = new CanvasPathBuilder(args.DrawingSession))
{
// 这里可以画出 Path 或写出文字 lindexi.github.io
canvasPathBuilder.BeginFigure(100, 100);
canvasPathBuilder.AddLine(200, 100);
canvasPathBuilder.EndFigure(CanvasFigureLoop.Open);
args.DrawingSession.DrawGeometry(CanvasGeometry.CreatePath(canvasPathBuilder), Colors.Gray, 2);
}画线
从上面的例子已经告诉大家如何画线,使用 BeginFigure 添加起点,然后使用 AddLine 把上一个点和输入的连成直线。
using (var canvasPathBuilder = new CanvasPathBuilder(args.DrawingSession))
{
// 这里可以画出 Path 或写出文字 lindexi.github.io
canvasPathBuilder.BeginFigure(100, 100);
canvasPathBuilder.AddLine(200, 100);
canvasPathBuilder.EndFigure(CanvasFigureLoop.Open);
}例子
下面给大家看一些已经画好的路径界面
绘制坐标系
private void DrawPath(CanvasControl canvas, CanvasDrawEventArgs args)
{
var width = (float) canvas.ActualWidth-20;
var height = (float) (canvas.ActualHeight)-20;
var midWidth = (float) (width * .5);
var midHeight = (float) (height * .5);
Color color = Colors.Gray;
using (var cpb = new CanvasPathBuilder(args.DrawingSession))
{
// Horizontal line
// 水平线
cpb.BeginFigure(new Vector2(0, midHeight));
cpb.AddLine(new Vector2(width, midHeight));
cpb.EndFigure(CanvasFigureLoop.Open);
// Horizontal line arrow
// 水平箭头
cpb.BeginFigure(new Vector2(width - 10, midHeight - 3));
cpb.AddLine(new Vector2(width, midHeight));
cpb.AddLine(new Vector2(width - 10, midHeight + 3));
cpb.EndFigure(CanvasFigureLoop.Open);
args.DrawingSession.DrawGeometry(CanvasGeometry.CreatePath(cpb), color,strokeWidth: 1);
}
using (var cpb = new CanvasPathBuilder(args.DrawingSession))
{
// Vertical line
// 垂直线
cpb.BeginFigure(new Vector2(midWidth, 0));
cpb.AddLine(new Vector2(midWidth, height));
cpb.EndFigure(CanvasFigureLoop.Open);
// Vertical line arrow
cpb.BeginFigure(new Vector2(midWidth - 3, 10));
cpb.AddLine(new Vector2(midWidth, 0));
cpb.AddLine(new Vector2(midWidth + 3, 10));
cpb.EndFigure(CanvasFigureLoop.Open);
args.DrawingSession.DrawGeometry(CanvasGeometry.CreatePath(cpb), color, 1);
}
}边栏推荐
- Kubernetes入门到精通- Operator 模式入门
- VPC2187/8 电流模式 PWM 控制器 4-100VIN 超宽压启动、高度集成电源控制芯片推荐
- limux入门3—磁盘与分区管理
- 【AI+医疗】斯坦福大学最新博士论文《深度学习在医学影像理解中的应用》,205页pdf
- Flask框架实现注册加密功能详解【Flask企业课学习】
- CPU突然飙高系统反应慢,是怎么导致的?有什么办法排查?
- 不论你是大众,科班和非科班,我这边整理很久,总结出的学习路线,还不快卷起来
- ECCV 2022 | FPN错位对齐,实现高效半监督目标检测(PseCo)
- 什么是网站监控,网站监控软件有什么用?
- Short-term reliability and economic evaluation of resilient microgrids under incentive-based demand response programs (Matlab code implementation)
猜你喜欢

【STM32】入门(五):串口TTL、RS232、RS485

EuROC dataset format and related codes

什么是网站监控,网站监控软件有什么用?

火灾报警联网FC18中CAN光端机常见问题解答和使用指导

ptables基本语法使用规则

测试/开发程序员男都秃头?女都满脸痘痘?过好我们“短暂“的一生......

Short-term reliability and economic evaluation of resilient microgrids under incentive-based demand response programs (Matlab code implementation)

PHP代码审计9—代码执行漏洞

How does EasyCVR call the double-speed playback of device recording through the interface?

EasyCVR如何通过接口调用设备录像的倍速回放?
随机推荐
C#爬虫之通过Selenium获取浏览器请求响应结果
How can test engineers break through career bottlenecks?
MMDetection 使用示例:从入门到出门
VPC2187/8 电流模式 PWM 控制器 4-100VIN 超宽压启动、高度集成电源控制芯片推荐
群友求助,一周没有搞定的需求,3分钟就解决了?
机器学习——线性回归
Flink/Scala - Storing data with RedisSink
力扣学习---0804
Enterprise survey correlation analysis case
猜数字游戏
路由懒加载
Google Earth Engine APP——一键在线查看全球1984-至今年的影像同时加载一个影像分析
Usage of collect_list in Scala105-Spark.sql
如何进行自动化测试?
测试工程师如何突破职业瓶颈?
如何封装 svg
运力升级助力算力流转,中国数字经济的加速时刻
八一建军节 | 致敬中国人民解放军
Day018 Inheritance
mysql cdc 为什么需要RELOAD 这个权限?这个权限在采集数据的过程中的作用是什么?有哪