Я собираюсь сделать кросс-пост моего ответа из-за здесь , просто так, чтобы информация обошла.
Есть два способа рисования текста в .NET:
- GDI + (
graphics.MeasureString
и graphics.DrawString
) - GDI (
TextRenderer.MeasureText
и TextRenderer.DrawText
)
В .NET 1.1 всеиспользуется GDI + для рендеринга текста. Но возникли некоторые проблемы:
- Существуют некоторые проблемы с производительностью, вызванные несколько неконтролируемой природой GDI +, когда устанавливаются контексты устройства, а затем восстанавливается исходный послекаждый вызов.
- Механизмы формирования международного текста неоднократно обновлялись для Windows / Uniscribe и для Avalon (Windows Presentation Foundation), но не обновлялись для GDI +, что вызывает поддержку международного рендеринга для новых языковне имеют такого же уровня качества.
Таким образом, они знали, что хотят изменить .NET Framework, чтобы прекратить использовать GDI + систему рендеринга текста, и использовать GDI .Сначала они надеялись, что могут просто изменить:
graphics.DrawString
для вызова старого DrawText
API вместо GDI +.Но они не могли сделать так, чтобы перенос текста и интервал соответствовали точно так же, как в GDI + .
В Windows Forms 2.0 мы добавили поддержку для рисования текста GDI.Сначала у нас были грандиозные планы совать и продвигать в DrawText API так, чтобы мы могли точно соответствовать тому, как работает API-интерфейс DrawString в GDI +.Я действительно думаю, что мы подошли довольно близко, но есть фундаментальные различия в переносе слов и межсимвольном интервале, которые, как простые потребители обоих API, Windows Forms не могли решить.
Итак, теперь мы столкнулись с проблемой:мы хотим переключить всех на новые API TextRenderer, чтобы текст выглядел лучше, локализовался лучше, рисовался более согласованно с другими диалогами в операционной системе ... ... но мы не хотим разбивать людей, рассчитывающих на строку измерения GDI + для расчетовгде их текст должен располагаться.
Поэтому они были вынуждены оставить graphics.DrawString
для вызова GDI + (из соображений совместимости; люди, которые звонили graphics.DrawString
, внезапно обнаружили, что их текст не переноситсякак раньше). Из MSDN :
Класс TextRenderer на основе GDI был представлен в .NET Framework 2.0 для повышения производительности, улучшения внешнего вида текста и улучшения поддержки длямеждународные шрифты.В более ранних версиях .NET Framework класс Graphics на основе GDI + использовался для выполнения всей визуализации текста.GDI вычисляет межсимвольный интервал и перенос слов по-другому, чем GDI +.В приложении Windows Forms, которое использует класс Graphics для визуализации текста, это может привести к тому, что текст для элементов управления, использующих TextRenderer , будет отличаться от другого текста в приложении.Чтобы устранить эту несовместимость, вы можете установить для свойства UseCompatibleTextRendering
значение true для определенного элемента управления.Чтобы установить для UseCompatibleTextRendering
значение true для всех поддерживаемых элементов управления в приложении, вызовите метод Application.SetCompatibleTextRenderingDefault с параметром true .
Был создан новый статический класс TextRenderer
для переноса рендеринга текста GDI.У него есть два метода:
TextRenderer.MeasureText
TextRenderer.DrawText
Примечание: TextRenderer
- это обертка вокруг GDI, в то время как graphics.DrawString
- это обертка вокруг GDI +.
Затем возникла проблема, что делать со всеми существующими элементами управления .NET, например:
Они хотели переключить их на использование TextRenderer
(то есть GDI), но они должны были быть осторожными.Могут быть люди, которые зависели от того, как их элементы управления рисовали, как в .NET 1.1.Так родился « совместимый рендеринг текста ».
По умолчанию элементы управления в приложении ведут себя так же, как в .NET 1.1 (они « совместимы »).
Вы отключите режим совместимости, позвонив по номеру:
Application.SetCompatibleTextRenderingDefault(false);
Это делает ваше приложение лучше, быстрее, с лучшей международной поддержкой. Подведем итог:
SetCompatibleTextRenderingDefault(true) SetCompatibleTextRenderingDefault(false)
======================================= ========================================
default opt-in
bad good
the one we don't want to use the one we want to use
uses GDI+ for text rendering uses GDI for text rendering
graphics.MeasureString TextRenderer.MeasureText
graphics.DrawString TextRenderer.DrawText
Behaves same as 1.1 Behaves *similar* to 1.1
Looks better
Localizes better
Faster
Также полезно отметить отображение между GDI + TextRenderingHint
и соответствующим LOGFONT
качеством , используемым для рисования шрифта GDI:
TextRenderingHint mapped by TextRenderer to LOGFONT quality
======================== =========================================================
ClearTypeGridFit CLEARTYPE_QUALITY (5) (Windows XP: CLEARTYPE_NATURAL (6))
AntiAliasGridFit ANTIALIASED_QUALITY (4)
AntiAlias ANTIALIASED_QUALITY (4)
SingleBitPerPixelGridFit PROOF_QUALITY (2)
SingleBitPerPixel DRAFT_QUALITY (1)
else (e.g.SystemDefault) DEFAULT_QUALITY (0)
Образцы
Вот некоторые сравнения рендеринга текста GDI + (graphics.DrawString) и GDI (TextRenderer.DrawText):
GDI + : TextRenderingHintClearTypeGridFit
, GDI : CLEARTYPE_QUALITY
:
GDI + : TextRenderingHintAntiAlias
, GDI : ANTIALIASED_QUALITY
:
GDI + : TextRenderingHintAntiAliasGridFit
, GDI : не поддерживается, использует ANTIALIASED_QUALITY :
GDI + : TextRenderingHintSingleBitPerPixelGridFit
, GDI : PROOF_QUALITY
:
GDI + : TextRenderingHintSingleBitPerPixel
, GDI : DRAFT_QUALITY
:
Мне кажется странным, что DRAFT_QUALITY
идентичен PROOF_QUALITY
, что идентично CLEARTYPE_QUALITY
.
См. Также