WM _ DPICHANGED-Nachricht

Wird gesendet, wenn sich die effektiven Punkte pro Zoll (dpi) für ein Fenster geändert haben. Der DPI ist der Skalierungsfaktor für ein Fenster. Es gibt mehrere Ereignisse, die dazu führen können, dass sich der DPI ändert. Die folgende Liste gibt die möglichen Ursachen für die Änderung des DPI an.

  • Das Fenster wird auf einen neuen Monitor mit einem anderen DPI verschoben.
  • Der DPI des Monitors, der das Fenster hostet, ändert sich.

Der aktuelle DPI für ein Fenster entspricht immer dem letzten DPI, der von WM _ DPICHANGED gesendet wurde. Dies ist der Skalierungsfaktor, auf den das Fenster für Threads skaliert werden soll, die DPI-Änderungen kennen.

#define WM_DPICHANGED       0x02E0

Parameter

wParam

Das HIWORD des wParam enthält den Wert der Y-Achse des neuen DPI des Fensters. LowORD des wParam enthält den X-Achsenwert des neuen DPI des Fensters. Beispiel: 96, 120, 144 oder 192. Die Werte der X-Achse und der Y-Achse sind für Windows Apps identisch.

lParam

Ein Zeiger auf eine RECT-Struktur, die eine vorgeschlagene Größe und Position des aktuellen Fensters bereitstellt, das für den neuen DPI skaliert wird. Es wird erwartet, dass Apps Fenster basierend auf den Vorschlägen von lParam bei der Verarbeitung dieser Nachricht neu positionieren und ihre Größe ändern.

Rückgabewert

Wenn eine Anwendung diese Nachricht verarbeitet, sollte sie 0 (null) zurückgeben.

Bemerkungen

Diese Meldung ist nur für PROCESS _ PER MONITOR _ _ DPI _ AWARE-Anwendungen oder DPI AWARENESS PER _ MONITOR _ _ _ AWARE-Threads relevant. Sie kann bei bestimmten DPI-Änderungen empfangen werden, wenn Ihr Fenster oder Prozess der obersten Ebene als DPI-nicht bekannt oder System-DPI-fähigen ausgeführt wird, aber in diesen Situationen problemlos ignoriert werden kann. Weitere Informationen zu den verschiedenen Arten von Bewusstsein finden Sie unter PROCESS _ DPI _ AWARENESS und DPI _ AWARENESS. Ältere Versionen von Windows erforderten, dass DPI-Informationen auf anwendungsebene gebunden werden. Diese Apps verwenden PROCESS _ DPI _ AWARENESS. Derzeit ist die DPI-Kenntnis nicht an die gesamte Anwendung, sondern an Threads und einzelne Fenster gebunden. Diese Apps verwenden DPI _ AWARENESS.

Sie müssen beim Skalieren ihrer Anwendung nur die X-Achse oder den Wert der Y-Achse verwenden, da sie identisch sind.

Um diese Meldung ordnungsgemäß zu verarbeiten, müssen Sie die Größe ihres Fensters entsprechend den Vorschlägen von lParam ändern und neu positionieren und SetWindowPosverwenden. Wenn Sie dies nicht tun, vergrößert oder verkleinert sich das Fenster in Bezug auf alles andere auf dem neuen Monitor. Wenn ein Benutzer beispielsweise mehrere Monitore verwendet und ihr Fenster von einem 96-DPI-Monitor auf einen 192-DPI-Monitor zieht, scheint das Fenster im Hinblick auf andere Elemente auf dem 192-DPI-Monitor halb so groß zu sein.

Der Basiswert von DPI ist als USER _ DEFAULT SCREEN _ _ DPI definiert, der auf 96 festgelegt ist. Um den Skalierungsfaktor für einen Monitor zu bestimmen, nehmen Sie den DPI-Wert und dividieren durch USER _ DEFAULT SCREEN _ _ DPI. Die folgende Tabelle enthält einige Beispiel-DPI-Werte und zugehörige Skalierungsfaktoren.

DPI-Wert Skalierungsprozentsatz
96 100 %
120 125%
144 150%
192 200 %

Das folgende Beispiel stellt einen Beispiel-DPI-Änderungshandler bereit.

    case WM_DPICHANGED:
    {
        g_dpi = HIWORD(wParam);
        UpdateDpiDependentFontsAndResources();

        RECT* const prcNewWindow = (RECT*)lParam;
        SetWindowPos(hWnd,
            NULL,
            prcNewWindow ->left,
            prcNewWindow ->top,
            prcNewWindow->right - prcNewWindow->left,
            prcNewWindow->bottom - prcNewWindow->top,
            SWP_NOZORDER | SWP_NOACTIVATE);
        break;
    }

Der folgende Code skaliert linear einen Wert von 100 % (96 DPI) auf einen beliebigen DPI, der durch g _ dpi definiert wird.

    INT iBorderWidth100 = 5;
    iBorderWidth = MulDiv(iBorderWidth100, g_dpi, USER_DEFAULT_SCREEN_DPI);

Eine alternative Möglichkeit zum Skalieren eines Werts besteht darin, den DPI-Wert in einen Skalierungsfaktor zu konvertieren und zu verwenden.

    INT iBorderWidth100 = 5;
    FLOAT fscale = (float) g_dpi / USER_DEFAULT_SCREEN_DPI;
    iBorderWidth = iBorderWidth100 * fscale;

Requirements (Anforderungen)

Anforderung Wert
Unterstützte Mindestversion (Client)
[Windows 8.1 Nur Desktop-Apps]
Unterstützte Mindestversion (Server)
Windows Server 2012 Nur [ R2-Desktop-Apps]
Header
WinUser.h

Weitere Informationen

_DPI-KENNTNIS

_ _ PROZESS-DPI-KENNTNIS