Von WindowsClient.net:
GDI+ fügt einen kleinen Betrag (1/6 em) an jedes Ende der angezeigten Zeichenfolge an. Diese 1/6 em ermöglichen es, Glyphen mit überhängenden Enden (z. B. kursive ' f '), und gibt GDI+ einen kleinen Spielraum, um die Erweiterung des Rasters zu unterstützen.
Die Standardaktion von DrawString
bei der Anzeige von Nebenläufen gegen Sie arbeiten:
- Erstens fügt das Standard-StringFormat ein zusätzliches 1/6 em an jedem Ende der Ausgabe hinzu;
- Zweitens darf sich die Saite um bis zu einem em zusammenziehen, wenn die Spannweite des Rasters geringer ist als vorgesehen.
Um diese Probleme zu vermeiden:
- Immer bestehen
MeasureString
et DrawString
ein StringFormat, das auf dem typografischen StringFormat ( GenericTypographic
).
Einstellen der Grafiken TextRenderingHint
まで TextRenderingHintAntiAlias
. Diese Rendering-Methode verwendet Anti-Aliasing und Sub-Pixel-Glyphen-Positionierung, um die Notwendigkeit einer Rasteranpassung zu vermeiden, und ist daher von Natur aus auflösungsunabhängig.
Es gibt zwei Möglichkeiten, Text in .NET zu zeichnen:
- GDI+ (
graphics.MeasureString
et graphics.DrawString
)
- GDI (
TextRenderer.MeasureText
et TextRenderer.DrawText
)
Aus Michael Kaplans (rip) ausgezeichnetem Blog Alles aussortieren In .NET 1.1 alles verwendet GDI+ für die Wiedergabe von Text. Aber es gab einige Probleme:
- Es gibt einige Leistungsprobleme, die durch die etwas zustandslose Natur von GDI+ verursacht werden, bei der Gerätekontexte gesetzt und dann der ursprüngliche Zustand nach jedem Aufruf wiederhergestellt wird.
- Die Shaping-Engines für internationalen Text wurden für Windows/Uniscribe und für Avalon (Windows Presentation Foundation) mehrfach aktualisiert, nicht aber für GDI+, was dazu führt, dass die internationale Rendering-Unterstützung für neue Sprachen nicht den gleichen Qualitätsstandard aufweist.
Sie wussten also, dass sie das .NET-Framework ändern wollten, um die Verwendung von GDI+ Textwiedergabesystem, und verwenden Sie GDI . Zunächst hofften sie, sie könnten sich einfach umziehen:
graphics.DrawString
um die alte DrawText
API anstelle von GDI+. Aber sie konnten den Textumbruch und die Abstände nicht genau so gestalten, wie es GDI+ tat. Also waren sie gezwungen, die graphics.DrawString
GDI+ aufzurufen (aus Gründen der Kompatibilität; Leute, die graphics.DrawString
plötzlich feststellen, dass ihr Text nicht mehr so umbrochen wird wie früher).
Eine neue statische TextRenderer
Klasse wurde erstellt, um GDI-Text-Rendering zu verpacken. Sie hat zwei Methoden:
TextRenderer.MeasureText
TextRenderer.DrawText
Anmerkung: TextRenderer
ist ein Wrapper um GDI, während graphics.DrawString
ist immer noch ein Wrapper um GDI+.
Dann war da noch die Frage, was man mit all den vorhandenen .NET-Steuerelementen machen sollte, z.B.:
Sie wollten sie umstellen auf die Verwendung von TextRenderer
(d.h. GDI), aber sie mussten vorsichtig sein. Es könnte Leute geben, die darauf angewiesen sind, dass ihre Steuerelemente wie in .NET 1.1 gezeichnet werden. Und so wurde " kompatible Textdarstellung ".
Standardmäßig verhalten sich Steuerelemente in Anwendungen wie in .NET 1.1 (sie sind " kompatibel ").
Sie abbiegen Kompatibilitätsmodus durch Aufruf:
Application.SetCompatibleTextRenderingDefault(false);
Dies macht Ihre Anwendung besser, schneller und mit besserer internationaler Unterstützung. Zusammengefasst:
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
Es ist auch nützlich, die Zuordnung zwischen GDI+ TextRenderingHint
und die entsprechende LOGFONT
Qualität für das Zeichnen von GDI-Schriften verwendet:
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)
Proben
Hier sind einige Vergleiche zwischen GDI+ (graphics.DrawString) und GDI (TextRenderer.DrawText) Textrendering:
GDI+ : TextRenderingHintClearTypeGridFit
, GDI : CLEARTYPE_QUALITY
:
![enter image description here]()
GDI+ : TextRenderingHintAntiAlias
, GDI : ANTIALIASED_QUALITY
:
![enter image description here]()
GDI+ : TextRenderingHintAntiAliasGridFit
, GDI : nicht unterstützt, verwendet ANTIALIASED_QUALITY :
![enter image description here]()
GDI+ : TextRenderingHintSingleBitPerPixelGridFit
, GDI : PROOF_QUALITY
:
![enter image description here]()
GDI+ : TextRenderingHintSingleBitPerPixel
, GDI : DRAFT_QUALITY
:
![enter image description here]()
Ich finde es merkwürdig, dass DRAFT_QUALITY
ist identisch mit PROOF_QUALITY
die identisch ist mit CLEARTYPE_QUALITY
.
Siehe auch