Direct2D und High-DPI
Das Schreiben einer DPI-fähigen Anwendung ist der Schlüssel, damit eine Benutzeroberfläche (UI) in einer Vielzahl von Anzeigeeinstellungen mit hohem DPI-Wert konsistent gut aussieht. Eine Anwendung, die nicht DPI-fähig ist, aber mit einer Anzeigeeinstellung mit hohem DPI-Wert ausgeführt wird, kann unter vielen visuellen Artefakten leiden, einschließlich falscher Skalierung von UI-Elementen, abgeschnittenem Text und verschwommenen Bildern. Indem Sie Ihrer Anwendung Unterstützung für DPI-Sensibilisierung hinzufügen, machen Sie die Darstellung der Benutzeroberfläche Ihrer Anwendung vorhersagbarer, wodurch sie visuell ansprechender und für Benutzer einfacher zu lesen ist. Glücklicherweise macht Direct2D es einfacher denn je, Anwendungen zu schreiben, die mit hoher DPI-Auflösung gut funktionieren. Dieses Thema enthält folgende Abschnitte:
- Unterstützung für hohe DPI-Werte in Direct2D
- Windows 8 und hohe DPI-Werte
- Was ist ein DIP?
- Zugehörige Themen
Unterstützung für hohe DPI-Werte in Direct2D
Direct2D bietet die folgenden Features für die Arbeit mit Szenarien mit hohen DPI-Werten:
- Es berücksichtigt automatisch den System-DPI, wenn ein Renderziel mit Fenstern erstellt wird, solange das Anwendungsmanifest angibt, dass die Anwendung DPI ordnungsgemäß verarbeitet. (Informationen zum Deklarieren, dass Ihre Anwendung DPI-fähig ist, finden Sie unter Sicherstellen, dass Ihre Anwendung auf Bildschirmen mit hohem DPI-Wert ordnungsgemäß angezeigt wird.)
- Es drückt Koordinaten in DIPs (Device Independent Pixels) aus, sodass die Anwendung automatisch skaliert werden kann, wenn sich die DPI-Einstellung ändert.
- Es ermöglicht Bitmaps, einen DPI-Wert zu haben und sie ordnungsgemäß zu skalieren, indem der DPI berücksichtigt wird. Dieses Feature kann auch verwendet werden, um Symbole mit unterschiedlichen Auflösungen zu verwalten.
- Es drückt die meisten Ressourcen in DIPs aus, wodurch die Ressourcen automatisch unabhängig von der Auflösung sind.
- Es verwendet einen Gleitkommakoordinatenraum und Antialiasing, sodass beliebige Inhalte auf beliebige DPI skaliert werden können.
Die Direct2D-Grafikpipeline ist für die Skalierung von 96 DPI auf 1200 DPI ausgelegt.
Windows 8 und hohe DPI-Werte
Ab Windows 8 gibt es zusätzliche Features für die Unterstützung hoher DPI-Werte.
Wenn der DPI-Wert des Gerätekontexts hoch genug ist, ändert Direct2D den Schwellenwert, der verwendet wird, um die vertikale Antialiasing von Text zu aktivieren. Dies führt zu einem schnelleren Rendern von Text auf Bildschirmen mit hoher DPI-Auflösung. Darüber hinaus können Sie den Einheitenmodus mit der ID2D1DeviceContext::SetUnitMode-Methode auf Pixel anstelle von DIPs umstellen. Wenn Sie den Einheitenmodus auf Pixel und den Gerätekontext DPI auf den Bildschirm-DPI festlegen, ist die Optimierung weiterhin aktiviert.
Was ist ein DIP?
Ein geräteunabhängiges Pixel (Device Independent Pixel, DIP) ist ein logisches Pixel, das den Pixeln des physischen Geräts über einen Skalar, den DPI, zugeordnet wird. DPI steht für Punkte pro Zoll (Dots per Inch), wobei ein Punkt ein physisches Gerätepixel darstellt. (Die Nomenklatur stammt aus dem Druckbereich, wo Punkte die kleinsten Tintenpunkte sind, die ein Druckverfahren erzeugen kann). Da ein Standardmonitor früher 96 Punkte pro Zoll hatte, bedeutete ein DPI von 96, dass ein geräteunabhängiges Pixel (oder DIP) 1:1 mit einem physischen Pixel zugeordnet wurde. Wenn der DPI beispielsweise 96*2 = 192 wäre, würde ein einzelnes DIP zwei physische Pixel umfassen.
Es gibt viele Gründe, warum Anwendungen diese Skalierung nicht unbedingt ordnungsgemäß verarbeiten. 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 Pixel physischer Geräte bei bruchteilalen DIP-Koordinaten enden, was einer der Gründe ist, 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 = (physisches Pixel × 96) / DPI
Hinweis
Ab Windows 8 können Sie den Einheitenmodus mithilfe der ID2D1DeviceContext::SetUnitMode-Methode auf Pixel anstelle von DIPs umstellen.
Zugehörige Themen