Как я могу сделать смешанный текст в DirectWrite?

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

1 ответ

Решение

Использование 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);
Другие вопросы по тегам