head.WriteLine()

Freitag, April 07, 2006

Text Rendering in .NET 2.0

Das Rendern von Text wurde in .NET 1.x fast vollständig durch interne GDI+-Funktionen realisiert und hierbei nicht auf entsprechende Windows-GDI-Funktionen zurückgegriffen. Dies hatte einige Nachteile. Neben der schlechteren Performance gab es auch Probleme bei der Darstellung von lokalisiertem Text. Zudem gab es einige Ungenauigkeiten bei der Berechnung von Textgrößen über die Graphics.MeasureString()-Methode.

.NET 2.0 geht nun quasi „back to the roots“ und setzt zum Rendern von Text wieder auf das gute, alte GDI. Aus Kompatibilitätsgründen konnte dies jedoch nicht vollständig unter der Haube geändert werden, sondern wurde ­ wie viele Neuerungen ­ als Erweiterung implementiert.

Die meisten Controls im Windows.Forms-Namespace gehen nun einen hybriden Weg: Je nach Einstellung, rendern Sie den Text entweder über GDI oder GDI+. Die Steuerung erfolgt hierbei über die SetCompatibleTextRenderingDefault()-Methode der Application-Klasse. Wenn Sie ein neues WinForms-Projekt in Visual Studio 2005 anlegen, wird standardmäßig die folgende Zeile eingefügt:

Application.SetCompatibleTextRenderingDefault(false);

Sie bewirkt, dass die Controls intern die neue Text Rendering-API verwenden. Wenn Sie selbst Text rendern, können Sie dies auch weiterhin über die Funktionen DrawText() und MeasureText() der Graphics-Klasse tun.

Graphics.DrawString(string text, Font font, Point point);
Graphics.MeasureString(string text, Font font);

Wollen Sie hingegen den GDI-Weg gehen, so steht Ihnen die neue TextRenderer-Klasse zu Verfügung, die folgende Methoden bietet:

TextRenderer.DrawText(Graphics gr, string text, Font font, Point point);
TextRenderer.MeasureText(string text, Font font);

Wie Sie sehen, funktionieren die Methoden sehr ähnlich.

Falls Sie das Thema näher interessiert, kann ich Ihnen den folgenden Artikel empfehlen, der in der März-Ausgabe des MSDN-Magazins erschienen ist:

Build World-Ready Apps Using Complex Scripts In Windows Forms Controls