Как я могу сделать смешанный текст в DirectWrite? - PullRequest
5 голосов
/ 01 ноября 2009

Я хочу использовать DirectWrite для смешанного цветного форматирования текста (точнее, для подсветки синтаксиса), но, похоже, не могу найти способ сделать это ни в параметрах макета, ни в типографии. Единственный вариант - передать кисть при рендеринге текста, что не работает для меня, потому что у меня есть только один макет. Помогите!

1 Ответ

9 голосов
/ 10 сентября 2011

Используйте IDWriteTextLayout::SetDrawingEffect, чтобы применить эффекты рисования к поддиапазонам. Если вы используете DWrite с D2D DrawTextLayout, что звучит так, как вы, то этот эффект рисования будет просто кистью (например, ID2D1Brush через CreateSolidColorBrush или одна из градиентных кистей). Если вы реализовали свой собственный IDWriteTextRenderer для IDWriteTextLayout::Draw, тогда эффект рисования может быть таким, каким вы его интерпретируете. В обратном вызове IDWriteTextRenderer::DrawGlyphRun вы затем вызываете QueryInterface для параметра DrawingEffect или, если вы уверены, что это ваш собственный тип, просто 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);
...