DirectWrite GDI 互操作:使用“IDWriteFontFace”绘制文本的简单方法
DirectWrite GDI interop: Simple way to draw text using an `IDWriteFontFace`
我有一个设备上下文,其中选择了一些字体,我想在 ID2D1RenderTarget
.
上 DrawText
目前,我通过以下途径实现这一目标:
- 通过
CreateFontFaceFromHdc
获得一个IDWriteFontFace
。
- 通过默认系统字体集合从
IDWriteFontFace
中获取 IDWriteFont
(我通过 GetSystemFontCollection
获取 - 请参阅下一步)。
- 通过
CreateTextFormat
获得一个IDWriteTextFormat
,提供IDWriteFont
中指定的参数并指定nullptr
为fontCollection
,表明我想使用默认的系统字体集。
- 将
IDWriteTextFormat
传递给 DrawText
。
我对此感到奇怪的是,我在第一步中已经有了一个 IDWriteFontFace
,显然必须 "go back" 并向字体集合询问 IDWriteFont
,只是将其传递给 DrawTextFormat
,然后可以将其用于 DrawText
。这似乎不必要地复杂 - 特别是因为要绘制文本,系统可能必须降低到 IDWriteFontFace
,对吗?
我找到了 DrawGlyphRun
,但这需要例如baselineOrigin
,我必须事先计算(更不用说 glyphRun
本身)。
如果我已经有了 IDWriteFontFace
,难道没有更简单的方法将文本绘制到 ID2D1RenderTarget
上吗?
正如您所描述的,这是唯一的方法。你回去构造文本格式实例,然后用它进行 DirectWrite 风格的渲染。 DrawGlyphRun
是一个底层方法,你当然可以使用它,但是你必须自己实现很多布局逻辑,这是要避免的。一般来说DrawText
是Direct2D渲染效率最低的方法,更好的方法是创建一次布局对象,每次需要重绘时都使用它。
我有一个设备上下文,其中选择了一些字体,我想在 ID2D1RenderTarget
.
DrawText
目前,我通过以下途径实现这一目标:
- 通过
CreateFontFaceFromHdc
获得一个IDWriteFontFace
。 - 通过默认系统字体集合从
IDWriteFontFace
中获取IDWriteFont
(我通过GetSystemFontCollection
获取 - 请参阅下一步)。 - 通过
CreateTextFormat
获得一个IDWriteTextFormat
,提供IDWriteFont
中指定的参数并指定nullptr
为fontCollection
,表明我想使用默认的系统字体集。 - 将
IDWriteTextFormat
传递给DrawText
。
我对此感到奇怪的是,我在第一步中已经有了一个 IDWriteFontFace
,显然必须 "go back" 并向字体集合询问 IDWriteFont
,只是将其传递给 DrawTextFormat
,然后可以将其用于 DrawText
。这似乎不必要地复杂 - 特别是因为要绘制文本,系统可能必须降低到 IDWriteFontFace
,对吗?
我找到了 DrawGlyphRun
,但这需要例如baselineOrigin
,我必须事先计算(更不用说 glyphRun
本身)。
如果我已经有了 IDWriteFontFace
,难道没有更简单的方法将文本绘制到 ID2D1RenderTarget
上吗?
正如您所描述的,这是唯一的方法。你回去构造文本格式实例,然后用它进行 DirectWrite 风格的渲染。 DrawGlyphRun
是一个底层方法,你当然可以使用它,但是你必须自己实现很多布局逻辑,这是要避免的。一般来说DrawText
是Direct2D渲染效率最低的方法,更好的方法是创建一次布局对象,每次需要重绘时都使用它。