DirectWrite GDI 互操作:使用"IDWriteFontFace"绘制文本的简单方法

DirectWrite GDI interop: Simple way to draw text using an `IDWriteFontFace`

本文关键字:quot 文本 简单 方法 绘制 IDWriteFontFace 使用 互操作 DirectWrite GDI      更新时间:2023-10-16

我有一个设备上下文,其中选择了某种字体,我想在ID2D1RenderTargetDrawText

目前,我走以下路线来实现这一点:

  • 通过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 呈现效率最低的方法,更好的方法是创建一次布局对象,并在每次需要重绘时使用它。