DirectWrite GDI 互操作:使用“IDWriteFontFace”绘制文本的简单方法
Posted
技术标签:
【中文标题】DirectWrite GDI 互操作:使用“IDWriteFontFace”绘制文本的简单方法【英文标题】:DirectWrite GDI interop: Simple way to draw text using an `IDWriteFontFace` 【发布时间】:2018-05-21 17:58:33 【问题描述】:我有一个设备上下文,其中选择了一些字体,我想在ID2D1RenderTarget
上DrawText
。
目前,我走以下路线来实现这一目标:
通过CreateFontFaceFromHdc
获取IDWriteFontFace
。
通过默认系统字体集合从IDWriteFontFace
获取IDWriteFont
(我是通过GetSystemFontCollection
获取的——请参阅下一步)。
通过CreateTextFormat
获取IDWriteTextFormat
,提供IDWriteFont
中指定的参数,将nullptr
指定为fontCollection
,表示我想使用默认的系统字体集合。
将IDWriteTextFormat
传递给DrawText
。
对此我感到奇怪的是,我在第一步中已经有一个IDWriteFontFace
,显然必须“返回”并要求一个字体集合获得一个IDWriteFont
,只是为了将它传递给一个@987654337 @,然后可以用于DrawText
。这似乎不必要地复杂 - 特别是因为要绘制文本,系统可能无论如何都必须下降到IDWriteFontFace
,对吧?
我找到了DrawGlyphRun
,但这需要例如baselineOrigin
,我必须事先计算(更不用说glyphRun
本身)。
如果我已经有了IDWriteFontFace
,难道没有更简单的方法可以在ID2D1RenderTarget
上绘制文本吗?
【问题讨论】:
实际上我不确定如果所选字体来自 AddFontMemResourceEx() 会发生什么。在这种情况下,它在系统集合中将不可用。 【参考方案1】:正如您所描述的,这是唯一的方法。你回去构造文本格式实例,然后用它进行 DirectWrite 风格的渲染。 DrawGlyphRun
是一个低级的方法,你当然可以使用它,但是你必须自己实现很多布局逻辑,这是要避免的。一般来说DrawText
是Direct2D渲染效率最低的方法,更好的方法是创建一次布局对象,每次需要重绘时使用。
【讨论】:
谢谢!但是生成IDWriteTextLayout
首先需要IDWriteTextFormat
,所以我不能在那里使用IDWriteFontFace
,可以吗?
是的,你当然也需要格式对象。复杂性来自于您首先使用 GDI 互操作这一事实。为了能够使用 DrawText,您只需要知道姓氏和字体属性。同样,请参阅我的其他评论,我不确定它如何用于内存字体资源,这也可能是一个限制因素。以上是关于DirectWrite GDI 互操作:使用“IDWriteFontFace”绘制文本的简单方法的主要内容,如果未能解决你的问题,请参考以下文章
D3D11:如何将 GDI 文本绘制到 GXDI 表面? (没有 D2D)