本文来告诉大家如何在 Direct2D1 绘制基本图形,包括线段、矩形、椭圆
本文是一个系列
本文的组织参考Direct2D,对大神表示感谢。
在开始前先告诉大家为何需要使用 Direct2D ,虽然 WPF 也是基于 DX 进行渲染,但是 WPF 做了很多兼容处理,所以没有比直接使用 Direct2D 的性能高。经过测试,在使用下面的所有代码,占用 CPU 几乎都是 0% ,因为没有布局、透明和事件处理,所以速度是很快。
点
在 Direct2D 使用的 点是 Point2F ,传入的是两个 float ,和 Point 差不多。
Point2F 也是一个结构体,所以和 Point 类型差不多
线段
线段需要使用 DrawLine ,方法的签名
所以使用下面的方法就可以在 (10,10) (100,10) 画出一条宽度为 2 的红线
上面的代码运行在WPF 使用 Direct2D1 画图入门文章的 OnRendering 方法,为了让大家也可以试试下面的代码,建议大家先去看这篇博客。
关于笔刷会在后面说
StrokeStyle
可以看到上面线段的最后一个参数是 StrokeStyle 那么这个参数是如何创建?在 Direct2D 有很多类都不能直接直接创建需要使用 D2DFactory 或 RenderTarget 才能创建。StrokeStyle 就需要使用 D2DFactory 进行创建。
创建 StrokeStyle 需要参数 StrokeStyleProperties,这个类的构造有两个重载,一个是不需要参数,另一个是需要很多参数。代码请看下面。
从代码的命名大概大家也可以知道 StrokeStyleProperties 参数的意思,下面先创建一个没有构造函数的来创建 StrokeStyle ,请看下面代码
需要注意,创建 strokeStyle 的工厂需要和创建 RenderTarget 一样,如果使用不一样的工厂就会出现下面异常。
所以需要修改WPF 使用 Direct2D1 画图入门文章的代码,把 D2DFactory 写为字段
StrokeStyleProperties
关于 StrokeStyleProperties 需要说一下,就是各个参数。
从名字可以看到 StartCap 和 EndCap 就是线段的两端的图形,可以选的参数
- Flat
- Square
- Round
- Triangle
具体表示是什么,我会使用下面的例子
Flat
平的
Round
圆的
Square
方形
Triangle
三角形
DashStyle
如果需要画虚线就可以使用 DashStyle ,虚线显示就是使用 CapStyle
大家自己试一试就知道
里面还有属性 LineJoin 这个不是线段可以做的,是折线才可以使用,表示两个线段如何链接
矩形
画矩形使用 DrawRectangle ,参数需要传入 RectF 需要传入上下左右的浮点数。
矩形有两个重载
矩形的 StrokeStyle 和线段一样。
椭圆
实际上画圆和椭圆是一样的,画圆的函数有两个重载
需要先创建 Ellipse 和笔刷。
创建 Ellipse 需要给圆心和两个轴,下面创建一个圆心在 (100,100) ,两个轴都是50的椭圆。实际上就是半径是50的圆形。
这就是绘制基本的图形。
那么如何填充图形?实际上所有 Draw 都有对应的 Fill 函数,除了线段。所以填充就是调用对应的 Fill 函数。
尝试运行程序,看看这时的 CPU ,实际上是几乎不会动,因为所有的计算都在 GPU 计算。不过程序里的代码包括创建图形,实际上是在 CPU 创建,但是因为速度很快,几乎不需要计算,所以需要的时间很短。
文字
最后就是告诉大家如何绘制文字。
绘制文字需要使用 DirectWrite ,需要先创建 DWriteFactory 然后才可以绘制文本。
绘制文本有多个方式,因为需要的很多参数都不能直接创建需要使用 DWriteFactory 创建,所以这里需要先使用下面代码
创建文字有多个方法
因为有很多个参数,需要大家自己去试试
下面来写出简单文字
需要先创建 textFormat 需要告诉使用哪个字形,和字体大小
下面就是画出文字,文字换行可以使用\n
,复杂的换行请使用文字重载方法,这里我就不说了
需要说的是 Windows API Code Pack 1.1 已经很久没更新,而且有错误,所以建议使用 SharpDX
参见:Using Direct2D with WPF - CodeProject
https://jeremiahmorrill.wordpress.com/2011/02/14/a-critical-deep-dive-into-the-wpf-rendering-system/
原文链接: http://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-Direct2D1-%E7%94%BB%E5%9B%BE-%E7%BB%98%E5%88%B6%E5%9F%BA%E6%9C%AC%E5%9B%BE%E5%BD%A2
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系。