Message WM_DPICHANGED

Envoyé lorsque les points effectifs par pouce (ppp) d’une fenêtre ont changé. La ppp est le facteur d’échelle d’une fenêtre. Plusieurs événements peuvent entraîner la modification de la ppp. La liste suivante indique les causes possibles de la modification de la ppp.

  • La fenêtre est déplacée vers un nouveau moniteur qui a une autre PPP.
  • La ppp du moniteur hébergeant la fenêtre change.

Le ppp actuel d’une fenêtre est toujours égal à la dernière PPP envoyée par WM_DPICHANGED. Il s’agit du facteur d’échelle auquel la fenêtre doit être mise à l’échelle pour les threads qui connaissent les modifications DPI.

#define WM_DPICHANGED       0x02E0

Paramètres

wParam

HiWORDde wParam contient la valeur de l’axe Y de la nouvelle ppp de la fenêtre. LOWORDde wParam contient la valeur de l’axe X de la nouvelle ppp de la fenêtre. Par exemple, 96, 120, 144, or 192. Les valeurs de l’axe X et de l’axe Y sont identiques pour les applications Windows.

lParam

Pointeur vers une structure RECT qui fournit une taille et une position suggérées de la fenêtre actuelle mise à l’échelle pour la nouvelle ppp. L’attente est que les applications repositionnent et redimensionnent les fenêtres en fonction des suggestions fournies par lParam lors de la gestion de ce message.

Valeur retournée

Si une application traite ce message, elle doit retourner à zéro.

Notes

Ce message n’est pertinent que pour les applications PROCESS_PER_MONITOR_DPI_AWARE ou les threads DPI_AWARENESS_PER_MONITOR_AWARE. Il peut être reçu sur certaines modifications de la ppp si votre fenêtre ou processus de niveau supérieur s’exécute en tant que ppp sans connaissance ou ppp système, mais dans ces situations, il peut être ignoré en toute sécurité. Pour plus d’informations sur les différents types de sensibilisation, consultez PROCESS_DPI_AWARENESS et DPI_AWARENESS. Les versions antérieures de Windows ont requis la prise en charge des ppp pour être liées au niveau d’une application. Ces applications utilisent PROCESS_DPI_AWARENESS. Actuellement, la prise en charge des ppp est liée aux threads et aux fenêtres individuelles plutôt qu’à l’ensemble de l’application. Ces applications utilisent DPI_AWARENESS.

Vous devez uniquement utiliser l’axe X ou la valeur de l’axe Y lors de la mise à l’échelle de votre application, car elles sont identiques.

Pour gérer correctement ce message, vous devez redimensionner et repositionner votre fenêtre en fonction des suggestions fournies par lParam et à l’aide deSetWindowPos. Si vous ne faites pas cela, votre fenêtre augmente ou se réduit par rapport à tout le reste sur le nouveau moniteur. Par exemple, si un utilisateur utilise plusieurs moniteurs et fait glisser votre fenêtre d’un moniteur 96 PPP vers un moniteur 192 ppp, votre fenêtre semble être de moitié aussi grande que d’autres éléments sur le moniteur 192 ppp.

La valeur de base de ppp est définie comme USER_DEFAULT_SCREEN_DPI qui est définie sur 96. Pour déterminer le facteur de mise à l’échelle d’un moniteur, prenez la valeur ppp et divisez par USER_DEFAULT_SCREEN_DPI. Le tableau suivant fournit des exemples de valeurs ppp et des facteurs de mise à l’échelle associés.

Valeur ppp Pourcentage de mise à l’échelle
96 100 %
120 125%
144 150%
192 200%

L’exemple suivant fournit un exemple de gestionnaire de modifications ppp.

    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;
    }

Le code suivant met à l’échelle de manière linéaire une valeur comprise entre 100 % (96 ppp) et un ppp arbitraire défini par g_dpi.

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

Une autre façon de mettre à l’échelle une valeur consiste à convertir la valeur ppp en facteur d’échelle et à l’utiliser.

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

Spécifications

Condition requise Value
Client minimal pris en charge
Windows 8.1 [applications de bureau uniquement]
Serveur minimal pris en charge
Windows Server 2012 R2 [applications de bureau uniquement]
En-tête
WinUser.h

Voir aussi

DPI_AWARENESS

PROCESS_DPI_AWARENESS