DirectWrite GDI interop:使用`IDWriteFontFace`绘制文本的简单方法

时间:2017-12-07 15:18:52

标签: c++ windows gdi direct2d directwrite

我有一个设备上下文,其中选择了一些字体,我想在DrawTextID2D1RenderTarget

目前,我采取以下方式来实现这一目标:

  • 通过IDWriteFontFace获取CreateFontFaceFromHdc
  • 通过默认系统字体集合从IDWriteFont获取IDWriteFontFace(我通过GetSystemFontCollection获取 - 请参阅下一步)。
  • 通过IDWriteTextFormat获取CreateTextFormat,提供IDWriteFont中指定的参数并将nullptr指定为fontCollection,表示我想使用默认系统字体集合。
  • IDWriteTextFormat传递给DrawText

我觉得奇怪的是,我在第一步中已经有IDWriteFontFace,显然必须“回去”并询问字体集合IDWriteFont,只是为了通过到DrawTextFormat,然后可以用于DrawText。这似乎不必要地复杂化 - 特别是因为绘制文本,系统可能不得不降到IDWriteFontFace,对吧?

我找到DrawGlyphRun,但这需要例如一个baselineOrigin,我必须事先计算(更不用说glyphRun本身了。)

如果我已经拥有ID2D1RenderTarget,是否有更简单的方法在IDWriteFontFace上绘制文字?

1 个答案:

答案 0 :(得分:2)

这是唯一的方式,就像你描述的那样。您将返回构建文本格式实例,然后将其用于DirectWrite样式呈现。 DrawGlyphRun是一种低级方法,当然可以使用它,但是你必须自己实现很多布局逻辑,这是要避免的。一般来说DrawText是使用Direct2D渲染效率最低的方法,更好的方法是创建一次布局对象,并在每次需要重绘时使用它。