Ответ 1
Из WindowsClient.net:
GDI + добавляет небольшое количество (1/6 em) к каждому концу каждой отображаемой строки. Этот 1/6 em позволяет использовать глифы с нависшими концами (например, курсивом f), а также дает GDI + небольшое количество свободного хода, чтобы помочь с расширением сетки.
Действие по умолчанию
DrawString
будет работать против вас при отображении смежных прогонов:
- Во-первых, StringFormat по умолчанию добавляет дополнительные 1/6 em на каждом конце каждого выхода;
- Во-вторых, если ширина сетки меньше, чем указано, строка разрешается сжимать до em.
Чтобы избежать этих проблем:
- Всегда передавайте
MeasureString
иDrawString
StringFormat на основе типографского StringFormat (GenericTypographic
).
Установите GraphicsTextRenderingHint
на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, чтобы прекратить использование системы визуализации GDI + и использовать GDI. Сначала они надеялись, что они могут просто измениться:
graphics.DrawString
для вызова старого API DrawText
вместо GDI+. Но они не могли сделать соответствие текста и интервал точно так же, как и GDI+. Поэтому они были вынуждены оставить graphics.DrawString
для вызова GDI + (соображения совместимости; люди, которые звонили graphics.DrawString
, внезапно обнаруживали, что их текст не обертывался так, как он использовался).
Создан новый статический класс TextRenderer
для переноса текста GDI. Он имеет два метода:
TextRenderer.MeasureText
TextRenderer.DrawText
Примечание.
TextRenderer
является оберткой вокруг GDI, аgraphics.DrawString
все еще является оберткой вокруг GDI +.
Затем возникла проблема с тем, что делать со всеми существующими элементами управления .NET, например:
-
Label
-
Button
-
TextBox
Они хотели переключить их на использование 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
.
См. также
- UseCompatibleTextRendering - совместим с whaaaaaat?
- Сортировка всего: Быстрый просмотр Whidbey TextRenderer
- MSDN: структура LOGFONT
- AppCompat Guy: GDI и GDI + Эффективность рендеринга текста
- GDI + текст, независимость разрешения и методы рендеринга. Или - Почему мой текст выглядит по-разному в GDI + и в GDI?