У меня есть контекст устройства, в котором выбран какой-то шрифт, и я хотел бы DrawText
на ID2D1RenderTarget
,
В настоящее время я иду по этому пути:
IDWriteFontFace
с помощью CreateFontFaceFromHdc
,IDWriteFont
от IDWriteFontFace
через коллекцию системных шрифтов по умолчанию (которую я получаю через GetSystemFontCollection
— см. следующий шаг).IDWriteTextFormat
с помощью CreateTextFormat
, предоставляя параметры, указанные в IDWriteFont
и указав nullptr
как fontCollection
, указывая, что я хотел бы использовать коллекцию системных шрифтов по умолчанию.IDWriteTextFormat
в DrawText
,Что я нахожу странным в том, что у меня уже есть IDWriteFontFace
на первом этапе, и, видимо, придется «вернуться» и попросить коллекцию шрифтов для IDWriteFont
просто чтобы передать это DrawTextFormat
, который затем может быть использован для DrawText
, Это кажется излишне сложным — тем более что для рисования текста система, вероятно, должна IDWriteFontFace
в любом случае, верно?
я нашел DrawGlyphRun
но это занимает, например, baselineOrigin
, который я должен был бы вычислить заранее (не говоря уже о glyphRun
сам).
Нет ли более простого способа нарисовать текст на ID2D1RenderTarget
если у меня уже есть IDWriteFontFace
?
Это единственный способ, как вы описали. Вы возвращаетесь к созданию экземпляра текстового формата, а затем используете его для визуализации в стиле DirectWrite. DrawGlyphRun
Это низкоуровневый метод, вы, конечно, можете его использовать, но вам придется самостоятельно реализовывать много логики компоновки, и этого следует избегать. Вообще говоря DrawText
Это наименее эффективный метод рендеринга с Direct2D, лучший способ — создать объект макета один раз и использовать его каждый раз, когда вам нужно перерисовать.
Других решений пока нет …