Freigeben über


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.

  1. Erstellen Sie eine Datei namens DeclareDPIAware.manifest.

  2. 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>
    
  3. 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"/>