DirectWrite GDI interop: простой способ рисования текста с использованием `IDWriteFontFace`

У меня есть контекст устройства, в котором выбран какой-то шрифт, и я хотел бы DrawText на ID2D1RenderTarget,

В настоящее время я иду по этому пути:

  • Получить IDWriteFontFace с помощью CreateFontFaceFromHdc,
  • Получить IDWriteFont от IDWriteFontFace через коллекцию системных шрифтов по умолчанию (которую я получаю через GetSystemFontCollection — см. следующий шаг).
  • Получить IDWriteTextFormat с помощью CreateTextFormat, предоставляя параметры, указанные в IDWriteFont и указав nullptr как fontCollection, указывая, что я хотел бы использовать коллекцию системных шрифтов по умолчанию.
  • Пройти IDWriteTextFormat в DrawText,

Что я нахожу странным в том, что у меня уже есть IDWriteFontFace на первом этапе, и, видимо, придется «вернуться» и попросить коллекцию шрифтов для IDWriteFontпросто чтобы передать это DrawTextFormat, который затем может быть использован для DrawText, Это кажется излишне сложным — тем более что для рисования текста система, вероятно, должна IDWriteFontFace в любом случае, верно?

я нашел DrawGlyphRunно это занимает, например, baselineOrigin, который я должен был бы вычислить заранее (не говоря уже о glyphRun сам).

Нет ли более простого способа нарисовать текст на ID2D1RenderTarget если у меня уже есть IDWriteFontFace?

2

Решение

Это единственный способ, как вы описали. Вы возвращаетесь к созданию экземпляра текстового формата, а затем используете его для визуализации в стиле DirectWrite. DrawGlyphRun Это низкоуровневый метод, вы, конечно, можете его использовать, но вам придется самостоятельно реализовывать много логики компоновки, и этого следует избегать. Вообще говоря DrawText Это наименее эффективный метод рендеринга с Direct2D, лучший способ — создать объект макета один раз и использовать его каждый раз, когда вам нужно перерисовать.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector