Из WindowsClient.net:
GDI + добавляет небольшое количество (1/6 em) к каждому концу каждой отображаемой строки. Эта 1/6 em учитывает глифы с нависающими концами (например, курсив ' f '), а также дает GDI + небольшую свободу действий, чтобы помочь с расширением фитинга сетки.
Действие по умолчанию DrawString
будет работать против вас при отображении соседних прогонов:
- Во-первых, StringFormat по умолчанию добавляет дополнительные 1/6 em на каждом конце каждого вывода;
- Во-вторых, когда ширина сетки меньше запланированной, струне разрешается сокращаться до em.
Чтобы избежать этих проблем:
- Всегда передавать
MeasureString
и DrawString
StringFormat на основе типографского StringFormat (GenericTypographic
).
Установите графику TextRenderingHint
на TextRenderingHintAntiAlias
. Этот метод рендеринга использует сглаживание и расположение субпиксельных символов, чтобы избежать необходимости подгонки к сетке, и, таким образом, по своей природе не зависит от разрешения.
Существует два способа рисования текста в .NET:
- GDI + (
graphics.MeasureString
и graphics.DrawString
)
- GDI (
TextRenderer.MeasureText
и TextRenderer.DrawText
)
Из отличного блога Майкла Каплана (rip) Сортировка всего этого , в .NET 1.1 все использовало GDI + для рендеринга текста. Но были некоторые проблемы:
- Существуют некоторые проблемы с производительностью, вызванные несколько отсутствующим состоянием GDI +, когда контексты устройства устанавливаются, а затем исходный восстанавливается после каждого вызова.
- Механизмы формирования для международного текста неоднократно обновлялись для Windows / Uniscribe и для Avalon (Windows Presentation Foundation), но не обновлялись для GDI +, что приводит к тому, что поддержка международного рендеринга для новых языков не имеет такой же уровень качество.
Таким образом, они знали, что хотят изменить .NET Framework, чтобы перестать использовать GDI + систему рендеринга текста, и использовать GDI . Сначала они надеялись, что могут просто измениться:
graphics.DrawString
для вызова старого DrawText
API вместо GDI +. Но они не могли сделать так, чтобы перенос текста и интервал соответствовали так, как это делал GDI +. Таким образом, они были вынуждены оставить graphics.DrawString
для вызова GDI + (по причинам совместимости; люди, которые звонили graphics.DrawString
, внезапно обнаружат, что их текст не переносится так, как раньше).
Был создан новый статический класс TextRenderer
для переноса рендеринга текста GDI. У него есть два метода:
TextRenderer.MeasureText
TextRenderer.DrawText
Примечание: TextRenderer
является оберткой вокруг GDI, в то время как graphics.DrawString
все еще является оберткой вокруг GDI +.
Затем возникла проблема с тем, что делать со всеми существующими элементами управления .NET, например ::1010*.
Они хотели переключить их на использование 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
.
См. Также