如何在DirectWrite中渲染混合颜色文本?

时间:2009-11-01 00:21:03

标签: directwrite

我想使用DirectWrite进行混合颜色文本格式化(确切地说是语法高亮显示),但似乎无法在Layout或Typography选项中找到方法。唯一的选择是在渲染文本时传递一个画笔,这对我不起作用,因为我基本上只有一个布局。救命啊!

1 个答案:

答案 0 :(得分:9)

使用IDWriteTextLayout::SetDrawingEffect对子范围应用绘图效果。如果你正在使用带有D2D DrawTextLayout的DWrite,它听起来就像你一样,那么绘图效果只是一个画笔(例如ID2D1Brush通过CreateSolidColorBrush或其中一个渐变画笔)。如果您已为IDWriteTextRenderer实施了自己的IDWriteTextLayout::Draw,则绘制效果可以是您解释的任何内容。在IDWriteTextRenderer::DrawGlyphRun回调中,然后在drawingEffect参数上调用QueryInterface,或者如果您确定它是您自己的类型,则直接使用static_cast。

// ... create the colored brushes and determine where to draw ...
wchar_t const* text = L"Red Green";
dwriteFactory->CreateTextLayout(....., OUT &textLayout);

DWRITE_TEXT_RANGE textRange1 = {0,3}, textRange2 = {4,5};

textLayout->SetDrawingEffect(redBrush,  textRange1);
textLayout->SetDrawingEffect(greenBrush, textRange2);

renderer->DrawTextLayout(point, textLayout, defaultBrush);