我有一个设备上下文,该上下文中已选择了一些字体,并且我想在DrawText上使用ID2D1RenderTarget

目前,我按照以下路线实现此目标:

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

  • 我对此感到奇怪的是,我已经在第一步中有了一个IDWriteFontFace,并且显然必须“返回”并向字体集合索取IDWriteFont,只是将其传递给DrawTextFormat,然后可以将其用于DrawText 。这似乎不必要地复杂-尤其是因为要绘制文本,系统可能仍必须使用IDWriteFontFace,对吗?

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

    如果我已经有了ID2D1RenderTarget,是否没有更简单的方法可将文本绘制到IDWriteFontFace上?

    最佳答案

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

    10-06 04:58