So stellen Sie sicher, dass Ihre Anwendung auf Bildschirmen mit hoher DPI-Auflösung ordnungsgemäß angezeigt wird
Obwohl DirectWrite viele Probleme mit hohen DPI-Werten für Sie behandelt, sollten Sie zwei Schritte ausführen, um sicherzustellen, dass Ihre Anwendung auf Bildschirmen mit hoher DPI-Auflösung ordnungsgemäß funktioniert.
Schritt 1: Verwenden des eigenen DPI des Fensters nach dem Erstellen
Dies kann mithilfe von Direct2D oder mithilfe von GDI erfolgen.
Direct2D
Die GetDpiForWindow-Funktion ruft den dpi-Wert (Dots per Inch) für ein angegebenes Fenster ab. Verwenden Sie die folgende Formel, um mit diesem Wert die Breite eines Fensters festzulegen:
< DPI> * <Breite, in Pixel> / <Standard-DPI>
... wobei DPI der wert ist, der von GetDpiForWindow erneut verwendet wird, und der Standardwert DPI ist 96. Die Formel ähnelt der vertikalen Achse:
< DPI> * <Höhe, in Pixel> / <standardmäßig vertikaler DPI>
Das Codebeispiel in Schritt 2.3 von Erstellen einer einfachen Direct2D-Anwendung ruft die DPI eines Fensters ab und legt dann die Größe auf 640 × 480 fest, skaliert auf den DPI.
Hinweis
Für eine Universelle Windows-Plattform-App (UWP) können Sie die DisplayInformation::LogicalDpi-Eigenschaft verwenden.
GDI
GDI stellt die GetDeviceCaps-Funktion zum Abrufen von Geräteinformationen bereit. Sie können DPI-Informationen abrufen, indem Sie die Indexwerte LOGPIXELSX und LOGPIXELSY übergeben. Die Formel zum Bestimmen der horizontalen und vertikalen Größe eines Fensters ist identisch mit dem obigen Direct2D-Beispiel .
Der folgende Code verwendet die GetDeviceCaps-Funktion , um ein 640 x 480-Fenster zu erstellen, das auf den System-DPI skaliert ist.
FLOAT dpiX, dpiY;
HDC screen = GetDC(0);
dpiX = static_cast<FLOAT>(GetDeviceCaps(screen, LOGPIXELSX));
dpiY = static_cast<FLOAT>(GetDeviceCaps(screen, LOGPIXELSY));
ReleaseDC(0, screen);
hWnd = CreateWindow(
TEXT("DirectWriteApp"),
TEXT("DirectWrite Demo App"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
static_cast<INT>(dpiX * 640.f / 96.f),
static_cast<INT>(dpiY * 480.f / 96.f),
NULL,
NULL,
hInstance,
NULL);
Schritt 2: Deklarieren, dass die Anwendung DPI-fähig ist
Wenn sich eine Anwendung als DPI-fähig deklariert, ist dies eine Anweisung, die angibt, dass sich die Anwendung bei DPI-Einstellungen bis zu 200 DPI gut verhält. Wenn die DPI-Virtualisierung in Windows Vista und Windows 7 aktiviert ist, werden Anwendungen skaliert, die nicht DPI-fähig sind, und Anwendungen erhalten virtualisierte Daten von den System-APIs, z. B. der GetSystemMetric-Funktion . Führen Sie die folgenden Schritte aus, um zu deklarieren, dass Ihre Anwendung DPI-fähig ist.
Erstellen Sie eine Datei namens DeclareDPIAware.manifest.
Kopieren Sie die folgende XML-Datei in die Datei, und speichern Sie sie:
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" > <asmv3:application> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <dpiAware>true</dpiAware> </asmv3:windowsSettings> </asmv3:application> </assembly>
Fügen Sie in der VCPROJ-Datei des Projekts in jedem Configuration-Element unter VisualStudioProject/Configurations den folgenden Eintrag hinzu:
<Tool Name="VCManifestTool" AdditionalManifestFiles="DeclareDPIAware.manifest"/>