Freigeben über


Direct2D und High-DPI

Das Schreiben einer DPI-fähigen Anwendung ist der Schlüssel, um eine Benutzeroberfläche konsistent in einer Vielzahl von Dpi-Anzeigeeinstellungen zu gestalten. Eine Anwendung, die nicht dpi-fähig ist, aber auf einer Bildschirmeinstellung mit hohem DPI-Wert ausgeführt wird, kann unter vielen visuellen Artefakten leiden, einschließlich einer falschen Skalierung von UI-Elementen, beschnittenem Text und verschwommenen Bildern. Indem Sie Ihrer Anwendung Unterstützung für die DPI-Sensibilisierung hinzufügen, machen Sie die Darstellung der Benutzeroberfläche Ihrer Anwendung vorhersehbarer, wodurch sie für Benutzer visuell ansprechender und einfacher zu lesen ist. Glücklicherweise erleichtert Direct2D das Schreiben von Anwendungen, die in hohem DPI-Wert gut funktionieren. Dieses Thema enthält die folgenden Abschnitte.

High-DPI-Unterstützung in Direct2D

Direct2D bietet die folgenden Features für die Arbeit mit Szenarien mit hohem DPI-Wert:

  • Es berücksichtigt automatisch den System-DPI-Wert beim Erstellen eines fensterierten Renderziels, solange das Anwendungsmanifest angibt, dass die Anwendung DPI korrekt verarbeitet. (Informationen zum Deklarieren, dass Ihre Anwendung DPI-fähig ist, finden Sie unter So wird sichergestellt, dass Ihre Anwendung auf High-DPI Displaysordnungsgemäß angezeigt wird.)
  • Er drückt Koordinaten in DIPs (Geräteunabhängige Pixel) aus, wodurch die Anwendung automatisch skaliert werden kann, wenn sich die DPI-Einstellung ändert.
  • Es ermöglicht Bitmaps, einen DPI-Wert zu haben und sie korrekt zu skalieren, indem der DPI-Wert berücksichtigt wird. Dieses Feature kann auch verwendet werden, um Symbole mit unterschiedlichen Auflösungen zu verwalten.
  • Er drückt die meisten Ressourcen in DIPs aus, wodurch die Ressourcen automatisch unabhängig von der Auflösung sind.
  • Es verwendet einen Gleitkommakoordinatenbereich und Antialiasing, sodass alle Inhalte auf beliebige DPI-Werte skaliert werden können.

Die Direct2D-Grafikpipeline ist für die Skalierung von 96 DPI auf 1200DPI ausgelegt.

Windows 8 und High-DPI

Ab Windows 8 gibt es zusätzliche Features für die Unterstützung mit hohem DPI-Wert.

Wenn der DPI-Wert des Gerätekontexts hoch genug ist, ändert Direct2D den Schwellenwert, der zum Aktivieren der vertikalen Antialiasierung von Text verwendet wird. Dies führt zu einem schnelleren Rendern von Text auf Bildschirmen mit hohem DPI-Wert. Darüber hinaus können Sie den Einheitenmodus anstelle von DIPs mithilfe der ID2D1DeviceContext::SetUnitMode-Methode auf Pixel umschalten. Wenn Sie den Einheitsmodus auf Pixel und den Dpi-Wert des Gerätekontexts auf den Bildschirm-DPI festlegen, ist die Optimierung weiterhin aktiviert.

Was ist ein DIP?

Ein geräteunabhängiges Pixel (DIP) ist ein logisches Pixel, das den Pixeln des physischen Geräts über einen skalaren DPI-Wert zugeordnet ist. DPI steht für Punkte pro Zoll, wobei ein Punkt ein physisches Gerätepixel darstellt. (Die Nomenklatur stammt aus dem Drucken, wobei Punkte der kleinste Tintenpunkt sind, den ein Druckprozess erzeugen kann). Da ein Standardmonitor 96 Punkte pro Zoll aufweist, bedeutete ein DPI-Wert von 96, dass ein geräteunabhängiges Pixel (oder DIP) 1:1 mit einem physischen Pixel zugeordnet wurde. Wenn der DPI-Wert beispielsweise 96*2 = 192 beträgt, würde ein einzelnes DIP zwei physische Pixel umfassen.

Es gibt viele Gründe, warum Anwendungen diese Skalierung nicht unbedingt richtig behandeln; Einer der einfachsten Gründe ist, dass es zusätzliche Arbeit erfordert, um diesen skalaren Wert beim Rendern zu ermitteln und zu verwenden. In Direct2D wird die Skalierung standardmäßig angewendet. Aufgrund dieser Zuordnung können physische Gerätepixel zu Bruchteilen von DIP-Koordinaten enden. Dies ist einer der Gründe, warum Direct2D einen Gleitkommakoordinatenraum verwendet.

physisches Pixel = (Dip × DPI) / 96

Verwenden Sie die folgende Formel, um ein physisches Pixel in ein DIP zu konvertieren:

dip = (physische Pixel × 96) / DPI

Anmerkung

Ab Windows 8 können Sie den Einheitenmodus anstelle von DIPs mithilfe der ID2D1DeviceContext::SetUnitMode-Methode in Pixel wechseln.

 

Sicherstellen, dass Ihre Anwendung auf High-DPI ordnungsgemäß angezeigt wird