message WM_DPICHANGED

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

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

Le PPP actuel d’une fenêtre est toujours égal au dernier PPP envoyé par WM_DPICHANGED. Il s’agit du facteur d’échelle vers lequel la fenêtre doit être mise à l’échelle pour les threads qui connaissent les modifications ppp.

#define WM_DPICHANGED       0x02E0

Paramètres

wParam

HiWORD du wParam contient la valeur de l’axe Y de la nouvelle ppp de la fenêtre. Le LOWORD du wParam contient la valeur de l’axe X du nouvel PPP de la fenêtre. Par exemple, 96, 120, 144 ou 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 le nouveau 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 s’applique uniquement aux applications PROCESS_PER_MONITOR_DPI_AWARE ou aux threads de DPI_AWARENESS_PER_MONITOR_AWARE . Il peut être reçu sur certaines modifications de ppp si votre fenêtre de niveau supérieur ou votre processus s’exécute en tant qu’ppp non conscient ou si le DPI système est conscient, 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 une prise en charge des PPP requises doivent ê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 de SetWindowPos. Si vous ne le faites pas, votre fenêtre s’agrandit ou diminue 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 PPP 96 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 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 façon 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 Valeur
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