我有一个设备上下文,其中选择了某种字体,我想在ID2D1RenderTarget
上DrawText
。
目前,我走以下路线来实现这一点:
- 通过
CreateFontFaceFromHdc
获取IDWriteFontFace
。 - 通过默认系统字体集合从
IDWriteFontFace
获取IDWriteFont
(我通过GetSystemFontCollection
获得 - 请参阅下一步)。 - 通过
CreateTextFormat
获取IDWriteTextFormat
,提供IDWriteFont
中指定的参数并将nullptr
指定为fontCollection
,表明我想使用默认的系统字体集合。 - 将
IDWriteTextFormat
传递给DrawText
。
我觉得奇怪的是,我在第一步中已经有了IDWriteFontFace
,显然必须"返回"并要求字体集合提供IDWriteFont
,只是为了将其传递给DrawTextFormat
,然后可以用来DrawText
。这似乎不必要地复杂 - 特别是因为要绘制文本,系统可能无论如何都必须下降到IDWriteFontFace
,对吧?
我找到了DrawGlyphRun
,但这需要例如baselineOrigin
,我必须事先计算(更不用说glyphRun
本身了)。
如果我已经有IDWriteFontFace
,难道没有更简单的方法将文本绘制到ID2D1RenderTarget
上吗?
这是唯一的方法,就像你描述的那样。返回到构造文本格式实例,然后将其用于 DirectWrite 样式呈现。DrawGlyphRun
是一种低级方法,您当然可以使用它,但您必须自己实现很多布局逻辑,这是要避免的。一般来说,DrawText
是使用 Direct2D 呈现效率最低的方法,更好的方法是创建一次布局对象,并在每次需要重绘时使用它。