我的目标是在单个布局中绘制具有一定范围,不同大小和不透明度的文本。ID2D1RenderTarget::DrawTextLayout
方法似乎是可行的。
defaultForegroundBrush
参数的文档:
画笔用于绘制textLayout中尚未绘制的文本将画笔作为绘图效果与之关联(由IDWriteTextLayout: SetDrawingEffect方法).
根据IDWriteTextLayout::SetDrawingEffect
法的备注部分,
ID2D1Brush(如颜色或渐变刷)可以设置为如果你使用的是ID2D1RenderTarget::DrawTextLayout来绘制文本,该笔刷将用于绘制指定的范围文本。
此绘图效果与指定的范围相关联,并且将被通过回调的方式传递回应用程序时,范围在绘图时绘制。
听起来ID2D1RenderTarget::DrawTextLayout
肯定会使用IDWriteTextLayout::SetDrawingEffect
设置的任何笔刷。这个非托管c++的答案似乎证实了这个想法。
然而,在实践中,DrawTextLayout
忽略了我使用SetDrawingEffect
设置的任何SolidColorBrush
。我在适当的范围内获得样式和大小,但所有内容都是使用默认画笔绘制的。
我通过实现一个自定义文本渲染器(gist)来解决这个问题,这非常简单,并且根据文档准确地绘制了我对ID2D1RenderTarget::DrawTextLayout
的期望。我会很满意,但TextRendererBase
和DrawGlyphRun
的性能比ID2D1RenderTarget::DrawTextLayout
慢25%以上。
是什么导致了这个问题?
ID2D1RenderTarget::DrawTextLayout
吗?代替:
layout.SetDrawingEffect(myBrush, new TextRange(1, 5));
这样写:
layout.SetDrawingEffect(myBrush.NativePointer, new TextRange(1, 5));