Hohe DPI in Windows

Ursprünglicher Autor: Christoph Nahr
  • Übersetzung
Windows bietet ab Vista zwei Mechanismen zum Anpassen von Anwendungen an Monitore mit einer hohen Pixeldichte (Dots per Inch, DPI): vergrößerte Systemschriftarten und vollständige Fenster. Leider kann ein Versuch, einige Ihrer Anwendungen in einem der Modi zum Laufen zu bringen, aufgrund einer Kombination aus nachlässigen Entwicklern und schlechten Entscheidungen von Microsoft fehlschlagen.

Diese Seite soll Benutzern helfen, mögliche Probleme beim Einstellen hoher DPI-Werte zu verstehen und zu beheben. Bitte beachten Sie, dass wir nur traditionelle Windows-Anwendungen berücksichtigen, nicht die Windows Store-Anwendungen ("Metro", "Modern UI"). Letztere verwenden die neue WinRT-API, die einen eigenen Skalierungsmechanismus bietet.

  1. Vom Übersetzer
  2. Skalierungsmethoden
  3. So ändern Sie die DPI-Einstellungen
  4. Arten von Anwendungen, wie sie skalieren (oder nicht skalieren)
  5. Weiterführende Literatur für Entwickler (ohne Übersetzung)


Vom Übersetzer


In diesem Artikel werden die folgenden Abkürzungen verwendet, deren Übersetzung ich nicht für angebracht hielt: Grafische Benutzeroberfläche (GUI), Punkte pro Zoll (DPI), DPI-bewusste Anwendungen - Anwendungen, die ihre GUI korrekt anzeigen können, ohne Verzerrung, ohne Verzerrung, Gerätegrafikschnittstelle (Gdi). Meine Kommentare (kursiv) .

Skalierungsmethoden


Traditionell verwenden native Windows-Desktopanwendungen zwei Anzeigemechanismen:
  • GDI-Funktionen (Graphical Device Interface) für den Zugriff auf das Display. In der Regel werden GDI-Koordinaten direkt in den Pixeln des Bildschirms gemessen, unabhängig von der Monitorgröße und der Pixeldichte.
  • Und Textausgabe mit Windows-Systemschriftarten. Dies ist optional, aber die meisten Anwendungen verwenden für den größten Teil ihrer grafischen Benutzeroberfläche (GUI) Systemschriftarten.

Anfangs hatten die meisten Monitore eine Pixeldichte von ca. 96 dpi. Daher sah die GUI, die diese Funktion verwendet, auf jedem System ziemlich gleich aus. Sobald sich jedoch die Pixeldichte erhöht, werden die GUI-Elemente solcher Anwendungen in Zentimetern oder Zoll reduziert (real, gemessen mit einem am Monitor angebrachten Lineal) . Kleine Texte und andere kleine Details werden immer schwieriger zu erkennen.

Um Abhilfe zu schaffen, hat Microsoft beschlossen, eine Art Skalierungsmethode in Windows zu erstellen. Eine der beiden unten beschriebenen Methoden (Windows XP oder Vista) wird verwendet, wenn der Benutzer eine DPI mit einem Wert festlegt, der höher ist als der Standardwert von 96 dpi. Beide Methoden versuchen, die Größe von Bildelementen zu erhöhen.

Windows XP-ähnliche Skalierung


Die erste dieser Methoden wurde, wie Sie vielleicht vermuten, in Windows XP verwendet. Diese Methode ist in der Tat keine Methode zum Skalieren von Anwendungen mit einer grafischen Oberfläche an sich. Nur die Systemschriftarten und einige Elemente der Benutzeroberfläche des Systems werden mit höheren DPI-Einstellungen skaliert (ich würde es die „NICHT-Skalierungsmethode“ im Stil von Windows XP nennen) .

Alle anderen Anwendungselemente werden weiterhin im Maßstab 1: 1 angezeigt. Der einzige Unterschied in der Darstellung besteht darin, dass Text und einige GUI-Elemente, die mithilfe von Systemfunktionen angezeigt werden, plötzlich größer werden. Zum Beispiel der Text auf den Schaltflächen. Dies führt zu offensichtlichen Problemen, auf die wir später noch eingehen werden.

Windows Vista-ähnliche Skalierung oder DPI-Virtualisierung


Windows Vista führte eine zweite Option mit einem seltsamen Namen ein: "Anzeigeskalierung", ohne dass dies näher erläutert wurde, um die Benutzer offensichtlich vollständig zu verwirren. Wir werden einen aussagekräftigeren Namen verwenden - die DPI-Virtualisierungsmethode. Wenn diese Methode aktiviert ist, führt Windows weiterhin eine Windows XP-ähnliche Skalierung durch. Nach wie vor nimmt die Größe aller Systemschriftarten und einiger Elemente der Systemschnittstelle zu.

Der Unterschied besteht darin, dass Anwendungen, die hohe DPI-Werte korrekt verwenden können, dies Windows mitteilen sollten. Solche Anwendungen sollten ein neues DPI-Aware-Flag setzen, indem sie entweder die Win32-API-Funktion "SetProcessDPIAware" aufrufen oder vorzugsweise ein Manifest mit dem dpiAware-Flag einbetten. Wenn die Anwendung jedoch kein DPI-Aware-Flag hat, verhält sich Windows anders. Zunächst wird eine interne Anzeige mit einer Auflösung von 96 dpi (Emulation einer DPI-Anwendung von 96) erstellt und anschließend das empfangene Bild gemäß den zuvor festgelegten DPI-Einstellungen skaliert Bildschirmausgabe.

Es wäre eine fantastische Skalierungsmethode, wenn alle unsere Monitore die Pixeldichte der neuesten iPhones (326 dpi) hätten. Leider ist das nicht so. Auf diese Weise skalierte Anwendungsfenster sehen bei einer gängigen Auflösung von 120 dpi etwas verschwommen aus (@homm ist übrigens keine Auflösung). Daher deaktiviert Microsoft die DPI-Virtualisierung standardmäßig, wenn Sie eine Pixeldichte von höchstens 120 DPI auswählen.

So ändern Sie die DPI-Einstellungen


Öffnen Sie in Windows 7/8 die Systemsteuerung, und wählen Sie Darstellung und Anpassung, dann Anzeige und schließlich Schriftgröße festlegen (DPI) (Windows 7) oder Benutzerdefinierte Größenoptionen ( Windows 8). Das folgende Dialogfeld wird angezeigt (Windows 7 in Windows 8 ist fast identisch):


In der Dropdown-Liste können Sie die gewünschte DPI-Einstellung in Prozent auswählen, wobei 100% 96 DPI und 125% entsprechen - wie im Screenshot entspricht dies 120 dpi (Sie können mehr) Notieren Sie den Wert manuell manuell) . Vor Windows 8 wurde die tatsächliche DPI ("Pixel pro Zoll") neben der Größe der Systemschriftart angezeigt. Windows 8 zeigt aus unbekannten Gründen den DPI-Wert nicht an, sodass Sie ihn selbst berechnen müssen.

Sie können auch ein Lineal anbringen.(Die eine Skala in Zoll hat) auf den Bildschirm, und versuchen , es zu kombinieren mit der Markierung auf dem Etikett auf dem Bildschirm, ändern Sie die Werte in der Dropdown-Liste. Das rot unterlegte Kontrollkästchen legt fest, ob nur eine Skalierung im Stil von Windows XP oder eine neue Art der DPI-Virtualisierung verwendet werden soll. Wenn das Kontrollkästchen nicht aktiviert ist (siehe Abbildung), ist die DPI-Virtualisierung aktiviert.

Rezitation.Dieses Dialogfeld ist ein Beispiel für eine benutzerfreundliche Oberfläche. Auf den ersten Blick scheint dies ein Flag zu sein, um die Skalierung im Stil von Windows XP zu deaktivieren. Diese Skalierungsmethode (die nur die Systemschriftarten und andere Elemente der Benutzeroberfläche des Systems vergrößert - Skalierung von Windows XP) ist jedoch immer aktiviert, wenn ein hoher DPI-Wert ausgewählt wird. Tatsächlich steuert dieses Flag, ob diese Methode die einzige ist. ( Nur Skalen im Stil von Windows XP verwenden.)oder die DPI-Virtualisierungsmethode wird auch für Anwendungen angewendet, die kein DPI-Aware-Flag haben. Dieses Flag steuert also nicht die im Namen angegebene Skalierungsmethode, sondern eine andere Skalierungsmethode, die nirgendwo erwähnt wird - und ermöglicht die Verwendung der neuen Methode, wenn das Kontrollkästchen deaktiviert ist!

Fehler in Windows 8. Zusätzlich wird in Windows 8 dieses Fehlerdialogfeld angezeigt. In der Regel funktioniert alles wie in Windows 7, jedoch wird der Status des Flags bei DPI-Werten von 150% und höher nicht gespeichert. Wenn Sie dieses Kontrollkästchen aktivieren, ist die DPI-Virtualisierung ordnungsgemäß deaktiviert. Das Kontrollkästchen selbst bleibt jedoch beim nächsten Öffnen dieses Dialogfelds deaktiviert.

Änderungen in Windows 8.1 oder warum ist alles verschwommen?


In Windows 8.1 verschwand das Flag für die Skalierung im Stil von Windows XP, und jetzt wird "DPI-Virtualisierung" nie bei DPI-Werten bis einschließlich 120 verwendet, sondern immer bei höheren Werten für Programme, die kein DPI-Aware-Flag haben. Wenn Ihnen einige Anwendungen verschwommen erscheinen, müssen Sie die DPI-Virtualisierung manuell deaktivieren.

Mit Windows 8.1 können Sie mehrere Monitore mit unterschiedlichen DPI-Werten verwenden. Diese Funktion erzwingt jedoch auch die Verwendung der „DPI-Virtualisierung“ für herkömmliche Anwendungen, die zwischen Monitoren mit unterschiedlichen DPI-Werten wechseln. Um dies zu vermeiden, können Sie die DPI-Skalierung in den DPI-Einstellungen mit der neuen Option „Ich möchte eine Skala für alle Anzeigen auswählen“ deaktivieren.

Windows 8.1 fügt außerdem einen speziellen Schalter zum Konfigurieren von 200% und eine neue API hinzu, sodass Entwickler die "DPI-Virtualisierung" selektiv deaktivieren können.

Hilfe, meine Systemschriftarten haben nicht die richtige Größe!


Manchmal stellen Sie nach dem Ändern der DPI-Einstellungen möglicherweise fest, dass einige Systemschriftarten für Neuinstallationen zu groß oder zu klein werden. Wahrscheinlich verwenden Sie ein benutzerdefiniertes Desktop-Design, das auf Ihren alten DPI-Einstellungen basiert. Windows skaliert keine benutzerdefinierten Designschriften.

Wenn Sie tatsächlich ein benutzerdefiniertes Desktop-Design erstellt haben und es speichern möchten, müssen Sie die Schriftarten selbst an die neuen DPI-Einstellungen anpassen. Windows hat jedoch die lästige Angewohnheit, aus irgendeinem Grund ohne Ihr Wissen „hilfreich“ benutzerdefinierte Designs zu erstellen. Wenn Sie noch nie ein benutzerdefiniertes Desktop-Design erstellt haben, löschen Sie es einfach und kehren Sie zum Standard-Design zurück.

Öffnen Sie in Windows 7/8 die Systemsteuerung, wählen Sie Darstellung und Personalisierung und dann Personalisierung aus. Wenn Sie den ausgewählten Eintrag in der Zeile "Eigene Designs" sehen, bedeutet dies, dass Windows ein Benutzerdesign verwendet, dessen Systemschriftarten von Windows nicht skaliert werden. Wählen Sie ein Standarddesign aus, z. B. den ersten Eintrag im Abschnitt "Aero-Designs" (Windows 7) oder "Windows-Standarddesigns" (Windows 8), und löschen Sie die unerwünschten Einträge im Abschnitt "Meine Designs". Jetzt sollten alle Systemschriftarten korrekt angezeigt werden.

Arten von Anwendungen, wie sie skalieren (oder nicht skalieren)


Schauen wir uns nun an, welche Methoden für vorhandene Windows-Anwendungen mit hohen DPI-Werten verwendet werden sollten. Die folgende Tabelle fasst zusammen, später werden wir verschiedene Fälle genauer betrachten.
DPI-Software-Flag nicht gesetztDPI-Flag Flag gesetzt
Nicht DPI -wareMüssen DPI-Virtualisierung verwendenBenötigen Sie Fixes von Entwicklern
DPI-WareSie müssen die Skalierung im Stil von Windows XP verwendenSkaliert immer richtig

Anwendungen, die sich überhaupt nicht für DPI interessieren, sind entweder sehr alt oder schlecht geschrieben, werden aber dennoch verwendet. Ein bekanntes Beispiel ist Apples iTunes für Windows. Hier verwenden Entwickler Systemschriften für die grafische Benutzeroberfläche und binden Fenstergrößen ohne Rücksicht auf die tatsächliche Schriftgröße starr an 96 DPI, was die grafische Benutzeroberfläche natürlich verzerrt, wenn die Schriftgrößen bei höheren DPI-Werten zunehmen.

Für solche Anwendungen ist eine neue Methode zur Skalierung der "DPI-Virtualisierung" erforderlich, die die Benutzeroberfläche leider häufig unscharf macht. Andernfalls treten Probleme auf, die vom Zuschneiden von Text bis zu überlappenden Steuerelementen reichen und die Benutzeroberfläche manchmal völlig unbrauchbar machen (zum Glück passiert dies nur selten). Im Laufe der Jahre habe ich mehrere Proben gesammeltScreenshots falscher Anwendungen.
Beispielanwendung, funktioniert nur mit DPI gleich 96


150% Auflösung (144 DPI)




Anwendungen, die ihre Benutzeroberfläche an unterschiedliche DPI-Werte anpassen können, aber kein DPI-Aware-Flag haben - Dies sind typische Anwendungen der Windows XP-Ära. Hier haben die Entwickler darauf geachtet, die tatsächlichen Schriftgrößen des Systems zu ermitteln, bevor sie die GUI erstellt haben. Solche Anwendungen werden bei Verwendung der Skalierung im Stil von Windows XP korrekt angezeigt. Leider wird, da sie das DPI-Aware-Flag nicht setzen, um Windows über diese Tatsache zu informieren, standardmäßig die DPI-Virtualisierung verwendet, wodurch die grafische Benutzeroberfläche unscharf wird. Dies gefällt Ihnen möglicherweise nicht, daher möchten Sie möglicherweise den Windows XP-Skalierungsstil für solche Anwendungen erzwingen.
Ein Beispiel für eine solche Anwendung und eine Auflösung von 150% (144 DPI)



Anwendungen, die ihre Benutzeroberfläche an unterschiedliche DPI-Werte anpassen können und über ein DPI-Aware-Flag verfügen - Dies ist der neueste Anwendungstyp, der unabhängig von den DPI-Einstellungen völlig problemlos ist. Das DPI-Aware-Flag wird automatisch für Windows Presentation Foundation (WPF) - und GDI + -Anwendungen festgelegt, da diese APIs integrierte Skalierungstools bieten. Entwickler, die die alte GDI-API und (überraschenderweise) Windows Forms verwenden, müssen ihre DPI-Aware-Anwendungen manuell kennzeichnen.

Anwendungen, die nicht für das Ändern von DPIs geeignet sind, aber ein DPI-Aware-Flag aufweisen , sind noch schlimmer, als den DPI-Wert vollständig zu ignorieren. In den Beispielen finden Sie GUI-Anwendungen mit einer Skalierung von bis zu 120 DPI, jedoch nicht höher, oder JavaFX- Anwendungen. Hier können wir nichts machen, weil Wir haben keine Möglichkeit, Windows zu zwingen, DPI-Virtualisierung für solche Programme zu verwenden. Sobald das DPI-Aware-Flag gesetzt ist, muss sich die Anwendung selbst skalieren. Wir können die Entwickler nur "sehen", um ihr Produkt zu reparieren - oder etwas anderes zu verwenden.

Wählen Sie eine Skalierungsmethode für Ihre Anwendungen


Sobald Sie sich für eine hohe DPI entschieden haben, hängt die Auswahl der Skalierungsmethode von den Anwendungen ab, in denen Sie arbeiten. Denken Sie daran, dass das Deaktivieren der DPI-Virtualisierung das Aktivieren des Kontrollkästchens mit dem falschen Namen "Windows XP-Skalen verwenden" und umgekehrt bedeutet.

  • Wenn Sie so viel Glück haben, nur Anwendungen zu verwenden, die DPI-fähig sind und das gewünschte Flag setzen, spielt es keine Rolle, welche Skalierungsmethode Sie wählen. Alle Anwendungen verwenden eine Windows XP-ähnliche Skalierung, und die DPI-Virtualisierung wird niemals verwendet.
  • Wenn Sie nur gut geschriebene DPI-Aware-Anwendungen verwenden, einige jedoch nicht das erforderliche Flag setzen, können Sie die DPI-Virtualisierung deaktivieren. Somit werden alle Anwendungen korrekt angezeigt, ohne dass es zu Unschärfen aufgrund von Skalierungen kommt. Wenn Ihr Monitor eine sehr hohe Pixeldichte hat, sodass skalierte Bitmaps nicht mehr verschwommen aussehen, sollten Sie die DPI-Virtualisierung trotzdem aktivieren.
  • Wenn Sie eine oder mehrere Anwendungen haben, die nicht für das Ändern von DPI geeignet sind und nicht über das DPI-Aware-Flag verfügen, müssen Sie die DPI-Virtualisierung aktivieren, wenn Sie nicht bereit sind, verzerrte GUI-Anwendungen zu installieren. Leider tritt hier ein weiteres Problem auf, da Microsoft diese Option unpraktisch implementiert hat. Sie können die DPI-Virtualisierung nur für das gesamte System und nicht für eine einzelne Anwendung aktivieren und dann für einzelne Anwendungen selektiv deaktivieren.


Wir erinnern Sie daran, dass in Windows 8.1 diesbezüglich keine Wahl mehr besteht. Wenn Sie mit einer Auflösung von 120 dpi (125%) arbeiten, muss jedes Programm die Windows XP-ähnliche Skalierung verwenden. Wenn Sie mit einer höheren Auflösung arbeiten, verwendet jedes Programm, das nicht DPI-fähig ist, die Standardeinstellung. " DPI-Virtualisierung. "

Deaktivieren Sie die DPI-Virtualisierung für einzelne Anwendungen


Wenn Sie sich für die DPI-Virtualisierung entscheiden oder Windows 8.1 mit einer Auflösung von mehr als 120 dpi ausführen, können Sie das System auf DPI-Aware-Anwendungen überprüfen, für die kein entsprechendes Flag vorhanden ist. Und geben Sie ihnen die Möglichkeit, die Windows XP-ähnliche Skalierung zu verwenden, für die sie vorgesehen sind. Es gibt zwei Möglichkeiten, dies zu tun: Die erste funktioniert nur für 32-Bit-Anwendungen, die zweite ist universell und auch für 64-Bit-Anwendungen geeignet.

32-Bit-Anwendungen- Es ist ganz einfach: Klicken Sie im Windows Explorer mit der rechten Maustaste auf die ausführbare Datei, wählen Sie das Dialogfeld "Eigenschaften", wechseln Sie zur Registerkarte "Kompatibilität" und aktivieren Sie das Kontrollkästchen "Bildskalierung bei hoher Bildschirmauflösung deaktivieren". Das ist alles, in Windows 8.1 funktioniert es auch für 64-Bit-Anwendungen.

64-Bit-Anwendungen - Ohne ersichtlichen Grund können Benutzer von 64-Bit-Anwendungen in Windows 8 und früheren Versionen verärgert werden. Das oben erwähnte Kontrollkästchen ist für 64-Bit-Anwendungen deaktiviert, obwohl die Option selbst durchaus funktionsfähig ist, wenn Sie Änderungen direkt an der Registrierung vornehmen! Starten Sie den Registrierungseditor, und

wechseln Sie zu diesem Schlüssel: HKEY_CURRENT_USER \ Software \ Microsoft \ Windows NT \ CurrentVersion \ AppCompatFlags \ Layers

Fügen Sie nun den Zeichenfolgenwert (REG_SZ) hinzu, dessen Name der vollständige Pfad zur ausführbaren Datei der Anwendung ist und dessen Wert HIGHDPIAWARE ist. Es wird empfohlen, zunächst mehrere 32-Bit-Anwendungen wie oben beschrieben zu ändern, damit in diesem Registrierungsschlüssel einige Beispielwerte angezeigt werden.

Wir haben untersucht, wie DPI-Einstellungen unter Windows Vista und höher verwendet werden können. Und wenn Sie sich jemals gefragt haben, wozu die Kompatibilitätsoption geeignet ist - "Deaktivieren Sie die Bildskalierung bei hoher Bildschirmauflösung". Und warum es auf Ihrem System nichts bewirkt, wissen Sie jetzt: Es ist nur dann wirksam, wenn Sie die systemweite Option "DPI-Virtualisierung" aktiviert haben und nur für Anwendungen, die das DPI-Aware-Flag nicht richtig setzen, aber die Skalierung korrekt verwenden Windows XP-Stil.

Weitere Lektüre


Weitere Informationen zu beiden Skalierungsmethoden aus Entwicklersicht finden Sie im MSDN-Artikel Schreiben von Win32-Anwendungen mit hoher Auflösung . Dieser Inhalt wurde nach Schreiben von DPI-Aware Desktop- und Win32-Anwendungen verschoben . Dieser lange Artikel enthält auch ein Beispielmanifest, mit dem eine Anwendung als DPI-fähig deklariert wird, sowie Beispiel-Screenshots für die verschiedenen Skalierungsmethoden und Tipps zur Skalierung der Anzeige im nativen Code.

Leider behandelt der Artikel derzeit nur Windows XP bis 7. Weitere Informationen zu Windows 8 und 8.1 finden Sie unter Schreiben von DPI-fähigen Desktopanwendungen in Windows 8.1 Preview (Word DOCX) und Chuck Walbourns Manifest Madness .

Außerhalb von Microsoft hat Gastón Hillar zwei Artikel zu Windows 8.1 bei Dr. Dobb's. Teil 1 behandelt grundlegende Konzepte und Teil 2 zeigt C / C ++ - Beispielcode für die Win32-API.

Vielleicht möchten Sie auch Andrew McKinlays The Joys of High DPI lesen, um eine nette (und erschreckende) Kriegsgeschichte über die Arbeit mit hohen DPI-Werten in Windows 7 zu lesen. Eine Bewertung der .NET- und Java-GUI-Frameworks finden Sie unter DPI-Skalierung in Windows-GUIs in Bezug auf DPI-Skalierung.

PS Weiterführender Link und Anzeigen von DPI-Aware-Flag-Anwendungen.
Danke homm für die Hilfe.

Jetzt auch beliebt: