Automatische Skalierung in Windows Forms

Mithilfe der automatischen Skalierung kann ein Formular mit den zugehörigen Steuerelementen, das auf einem Computer mit einer bestimmten Bildschirmauflösung oder Systemschriftart entworfen wurde, einwandfrei auf einem anderen Computer angezeigt werden, der über eine andere Bildschirmauflösung oder Systemschriftart verfügt. Dabei wird sichergestellt, dass die Größe des Formulars und der zugehörigen Steuerelemente intelligent geändert wird, damit sie auf die Größe der systemeigenen Fenster sowie anderer Anwendungen sowohl auf dem Benutzercomputer als auch auf dem Entwicklercomputer abgestimmt sind. Durch die Unterstützung von .NET Framework für die automatische Skalierung und visuelle Stile wird gewährleistet, dass .NET Framework-Anwendungen im Vergleich zu systemeigenen Windows-Anwendungen auf den einzelnen Benutzercomputern ein konsistentes Aussehen und Verhalten aufweisen.

Wann ist die automatische Skalierung erforderlich?

Ohne automatische Skalierung würde eine Anwendung, die für eine bestimmte Bildschirmauflösung oder Schriftart entworfen wurde, entweder zu klein oder zu groß angezeigt werden, wenn die jeweilige Auflösung oder Schriftart geändert wird. Wenn die Anwendung beispielsweise unter Verwendung von Tahoma 9 Punkt als Basisgröße entworfen wurde, würde sie auf einem Computer, auf dem die Systemschriftart auf Tahoma 12 Punkt eingestellt ist, ohne vorherige Anpassung zu klein angezeigt werden. Textelemente wie Titel, Menüs, Textfeldinhalt usw. werden kleiner als andere Anwendungen gerendert. Darüber hinaus richtet sich die Größe der Benutzeroberflächenelemente, die Text enthalten, z. B. Titelleiste, Menüs und viele Steuerelemente, nach der verwendeten Schriftart. Außerdem werden diese Elemente in diesem Beispiel relativ gesehen kleiner angezeigt.

Die gleiche Situation tritt auf, wenn eine Anwendung für eine bestimmte Bildschirmauflösung entworfen wurde. Die häufigste Bildschirmauflösung ist 96 DPI (Dots Per Inch), höher auflösende Bildschirme unterstützen jedoch mindestens 120, 133 oder 170 DPI und finden immer größere Verbreitung. Ohne vorherige Anpassung würde eine Anwendung, insbesondere eine Grafikanwendung, die für eine bestimme Auflösung entworfen wurde, entweder zu groß oder zu klein angezeigt werden, wenn sie mit einer anderen Auflösung ausgeführt wird.

Die automatische Skalierung hat den Zweck, diese Probleme abzuschwächen, indem die Größe des Formulars und der untergeordneten Steuerelemente entsprechend der relativen Schriftgröße und Bildschirmauflösung geändert wird. Das Windows-Betriebssystem unterstützt die automatische Skalierung von Dialogfeldern unter Verwendung einer relativen Maßeinheit, den so genannten Dialogeinheiten. Eine Dialogeinheit basiert auf der Systemschriftart, und ihre Beziehung zu Pixeln kann mithilfe der Win32 SDK-Funktion GetDialogBaseUnits ermittelt werden. Wenn ein Benutzer das von Windows verwendete Design ändert, werden alle Dialogfelder automatisch entsprechend angepasst. Außerdem:

.NET Framework unterstützt automatische Skalierung entweder nach der Systemstandardschriftart oder der Standardbildschirmauflösung. Die automatische Skalierung kann in einer Anwendung optional deaktiviert werden.

Ursprüngliche Unterstützung für die automatische Skalierung

In den Versionen 1.0 und 1.1 von .NET Framework wurde die automatische Skalierung in einer sehr direkten Weise unterstützt, die von der für die Benutzeroberfläche verwendeten Windows-Standardschriftart abhängig war. Diese wurde durch den Win32 SDK-Wert DEFAULT_GUI_FONT dargestellt. Diese Schriftart wird normalerweise nur geändert, wenn sich die Bildschirmauflösung ändert. Der folgende Mechanismus wurde verwendet, um die automatische Skalierung zu implementieren:

  1. Die (mittlerweile veraltete) AutoScaleBaseSize-Eigenschaft wurde zur Entwurfszeit auf die Höhe und Breite der Systemstandardschriftart des Entwicklercomputers festgelegt.

  2. Zur Laufzeit wurde die Systemstandardschriftart des Benutzercomputers verwendet, um die Font-Eigenschaft der Form-Klasse zu initialisieren.

  3. Vor dem Anzeigen des Formulars wurde die ApplyAutoScaling-Methode aufgerufen, um das Formular zu skalieren. Durch diese Methode wurde die relative Skaliergröße aus AutoScaleBaseSize und Font berechnet und dann die Scale-Methode aufgerufen, um die eigentliche Skalierung für das Formular und die untergeordneten Elemente auszuführen.

  4. Der Wert von AutoScaleBaseSize wurde aktualisiert, sodass das Formular durch nachfolgende Aufrufe an ApplyAutoScaling nicht progressiv geändert wurde.

Während dieser Mechanismus für die meisten Zwecke ausreichend war, brachte er folgende Einschränkungen mit sich:

  • Da die Schriftartbasisgröße von der AutoScaleBaseSize-Eigenschaft in Form von ganzzahligen Werten dargestellt wird, treten Rundungsfehler auf, die sichtbar werden, wenn ein Formular mehrere Auflösungen durchläuft.

  • Die automatische Skalierung wurde nur in der Form-Klasse, nicht aber in der ContainerControl-Klasse implementiert. Folglich wurden Benutzersteuerelemente nur richtig skaliert, wenn das Benutzersteuerelement mit derselben Auflösung wie das Formular entworfen und zur Entwurfszeit im Formular positioniert wurde.

  • Formulare und ihre untergeordneten Steuerelemente konnten von mehreren Entwicklern nur dann gleichzeitig entwickelt werden, wenn die Bildschirmauflösung der Computer identisch war. Entsprechend konnte von einem Formular auch nur geerbt werden, wenn die Auflösung mit der des übergeordneten Formulars übereinstimmte.

  • Diese Skalierung ist nicht kompatibel mit neueren Layout-Managern, die mit .NET Framework, Version 2.0, eingeführt wurden, z. B. FlowLayoutPanel und TableLayoutPanel.

  • Eine direkt auf der Bildschirmauflösung basierende Skalierung, die zwecks Kompatibilität mit .NET Compact Framework erforderlich ist, wurde nicht unterstützt.

Obwohl dieser Mechanismus in .NET Framework, Version 2.0, aus Gründen der Abwärtskompatibilität beibehalten wurde, wurde er durch einen robusteren Skalierungsmechanismus ersetzt, der im Folgenden beschrieben wird. Daher sind AutoScale, ApplyAutoScaling, AutoScaleBaseSize und bestimmte Scale-Überladungen als veraltet gekennzeichnet.

Tipp

Wenn Sie den Legacycode auf .NET Framework, Version 2.0, hochrüsten, können Sie Verweise auf diese Member gefahrlos löschen.

Aktuelle Unterstützung für die automatische Skalierung

.NET Framework, Version 2.0, umgeht frühere Beschränkungen, indem für die automatische Skalierung von Windows Forms folgende Änderungen eingeführt werden:

  • Die Basisunterstützung für die Skalierung wurde auf die ContainerControl-Klasse übertragen, sodass Formularen, systemeigenen zusammengesetzten Steuerelementen und Benutzersteuerelementen eine einheitliche Skalierungsunterstützung zur Verfügung steht. Die neuen Member AutoScaleFactor, AutoScaleDimensions, AutoScaleMode und PerformAutoScale wurden hinzugefügt.

  • Außerdem enthält die Control-Klasse mehrere neue Member, die ihre Mitwirkung an der Skalierung und die Unterstützung der gemischten Skalierung im selben Formular ermöglichen. Insbesondere die Member Scale, ScaleChildren und GetScaledBounds unterstützen die Skalierung.

  • Unterstützung für die Skalierung auf Grundlage der Bildschirmauflösung wurde hinzugefügt, um die Unterstützung von Systemschriftarten, so wie sie in der AutoScaleMode-Enumeration definiert ist, zu vervollständigen. Dieser Modus ist kompatibel mit der von .NET Compact Framework unterstützten automatischen Skalierung. Dadurch wird die Migration von Anwendungen vereinfacht.

  • Kompatibilität mit Layout-Managern, wie FlowLayoutPanel und TableLayoutPanel, wurde der Implementierung der automatischen Skalierung hinzugefügt.

  • Skalierungsfaktoren werden jetzt – normalerweise unter Verwendung der SizeF-Struktur – als Gleitkommawerte dargestellt, sodass Rundungsfehler praktisch eliminiert werden.

Warnung

Beliebige Mischungen aus DPI-Modi und Modi für die Schriftartskalierung werden nicht unterstützt. Obwohl Sie ein Benutzersteuerelement problemlos mithilfe eines Modus (z. B. DPI) skalieren und in einem Formular positionieren können, das einen anderen Modus (Schriftart) verwendet, kann es zu unerwarteten Ergebnissen kommen, wenn ein Grundformular in einem bestimmten Modus mit einem abgeleiteten Formular in einem anderen Modus gemischt wird.

Automatische Skalierung in Aktion

Windows Forms verwendet jetzt die folgende Logik, um Formulare und ihren Inhalt automatisch zu skalieren:

  1. Zur Entwurfszeit zeichnet jedes ContainerControl den Skalierungsmodus mit der aktuellen Auflösung in AutoScaleMode bzw. AutoScaleDimensions auf.

  2. Zur Laufzeit wird die tatsächliche Auflösung in der CurrentAutoScaleDimensions-Eigenschaft gespeichert. Die AutoScaleFactor-Eigenschaft berechnet das Verhältnis zwischen der Skalierungsauflösung zur Laufzeit und Entwurfszeit dynamisch.

  3. Wenn das Formular geladen wird und die Werte von CurrentAutoScaleDimensions und AutoScaleDimensions verschieden sind, wird die PerformAutoScale-Methode aufgerufen, um das Steuerelement mit den zugehörigen untergeordneten Elementen zu skalieren. Diese Methode übergeht das Layout und ruft die Scale-Methode auf, um die eigentliche Skalierung auszuführen. Danach wird der Wert von AutoScaleDimensions aktualisiert, um eine progressive Skalierung zu vermeiden.

  4. PerformAutoScale wird auch in den folgenden Situationen automatisch aufgerufen:

    • Als Reaktion auf das OnFontChanged-Ereignis, wenn der Skalierungsmodus Font lautet.

    • Wenn das Layout des Containersteuerelements wieder verwendet und eine Änderung in der AutoScaleDimensions-Eigenschaft oder der AutoScaleMode-Eigenschaft festgestellt wird.

    • Wenn ein übergeordnetes ContainerControl, wie oben angegeben, skaliert wird. Jedes Containersteuerelement ist für die Skalierung der enthaltenen untergeordneten Elemente zuständig. Dabei werden eigene Skalierungsfaktoren und nicht die des übergeordneten Containers verwendet.

  5. Untergeordnete Steuerelemente können ihr Skalierungsverhalten auf mehrere Weisen ändern:

    • Die ScaleChildren-Eigenschaft kann überschrieben werden, um zu bestimmen, ob ihre untergeordneten Steuerelemente skaliert werden sollen oder nicht.

    • Die GetScaledBounds-Methode kann überschrieben werden, um die Begrenzungen für die Skalierung des Steuerelements, aber nicht die Skalierungslogik anzupassen.

    • Die ScaleControl-Methode kann überschrieben werden, um die Skalierungslogik für das aktuelle Steuerelement zu ändern.

Siehe auch

Aufgaben

Gewusst wie: Aktivieren visueller Stile in Windows XP

Gewusst wie: Verbessern der Leistung durch das Vermeiden der automatischen Skalierung

Referenz

AutoScaleMode

Scale

PerformAutoScale

AutoScaleDimensions

Konzepte

Rendering von Steuerelementen mit visuellen Stilen