3

我的目标是在具有特定范围不同大小和不透明度的单一布局中绘制文本。该ID2D1RenderTarget::DrawTextLayout方法似乎是要走的路。

参数的文档defaultForegroundBrush

画笔用于在 textLayout 中绘制任何尚未有画笔关联的文本作为绘图效果(由 IDWriteTextLayout::SetDrawingEffect方法指定)。

根据该IDWriteTextLayout::SetDrawingEffect方法的备注部分,

如果您使用ID2D1RenderTarget::DrawTextLayout 绘制文本并且该笔刷将用于绘制指定范围的文本,则可以将ID2D1Brush(例如颜色或渐变笔刷)设置为绘制效果。

此绘制效果与指定范围相关联,在绘制时绘制范围时会通过回调的方式传回应用程序。

听起来ID2D1RenderTarget::DrawTextLayout肯定会使用IDWriteTextLayout::SetDrawingEffect. 这个不受管理的 C++ 答案似乎证实了这个想法。

但是,在实践中,DrawTextLayout忽略SolidColorBrush我使用SetDrawingEffect. 我得到了适当范围内的样式和大小,但一切都是使用默认画笔绘制的。

我通过实现一个自定义文本渲染器 ( gistID2D1RenderTarget::DrawTextLayout ) 来解决这个问题,它非常简单,并且完全按照文档的要求绘制了我所期望的内容。我会很满意,但 aTextRendererBase和的性能DrawGlyphRun比 . 慢 25% 以上ID2D1RenderTarget::DrawTextLayout

什么可能导致此问题?我可以按照文档的建议使用颜色并仍然使用ID2D1RenderTarget::DrawTextLayout吗?

4

1 回答 1

1

代替:

layout.SetDrawingEffect(myBrush, new TextRange(1, 5));

像这样称呼它:

layout.SetDrawingEffect(myBrush.NativePointer, new TextRange(1, 5));
于 2018-02-11T18:47:21.530 回答