Mensaje de WM_DPICHANGED

Se envía cuando los puntos por pulgada (ppp) eficaces de una ventana han cambiado. El valor de puntos por pulgada es el factor de escala de una ventana. Hay varios eventos que pueden hacer que el valor de puntos por pulgada cambie. En la lista siguiente se indican las posibles causas del cambio del valor de puntos por pulgada.

  • La ventana se mueve a un nuevo monitor que tiene otro valor de puntos por pulgada.
  • El valor de puntos por pulgada del monitor que hospeda la ventana cambia.

El valor de puntos por pulgada actual de una ventana siempre es igual al último valor de puntos por pulgada enviado por WM_DPICHANGED. Este es el factor de escala al que se debe escalar la ventana para aquellos subprocesos que son conscientes de los cambios del valor de puntos por pulgada.

#define WM_DPICHANGED       0x02E0

Parámetros

wParam

El valor HIWORD de wParam contiene el valor del eje Y del nuevo ppp de la ventana. El valor LOWORD de wParam contiene el valor del eje X del nuevo ppp de la ventana. Por ejemplo, 96, 120, 144 o 192. Los valores del eje X y del eje Y son idénticos para las aplicaciones de Windows.

lParam

Un puntero a una estructura RECT que proporciona un tamaño y una posición sugeridos de la ventana actual escalados para el nuevo valor de puntos por pulgada. La expectativa es que las aplicaciones cambien la posición y el tamaño de las ventanas en función de las sugerencias proporcionadas por lParam al controlar este mensaje.

Valor devuelto

Si la aplicación procesa este mensaje, debe devolver cero.

Comentarios

Este mensaje solo es relevante para aplicaciones de PROCESS_PER_MONITOR_DPI_AWARE o subprocesos de DPI_AWARENESS_PER_MONITOR_AWARE. Puede recibirse en determinados cambios del valor de puntos por pulgada si el proceso o la ventana de nivel superior se ejecutan como sin reconocimiento del valor de puntos por pulgada o con reconocimiento del valor de puntos por pulgada del sistema, pero en esas situaciones se puede omitir de forma segura. Para más información sobre los distintos tipos de reconocimiento, consulte PROCESS_DPI_AWARENESS y DPI_AWARENESS. Las versiones anteriores de Windows requerían que el reconocimiento del valor de puntos por pulgadas esté vinculado en el nivel de una aplicación. Esas aplicaciones usan PROCESS_DPI_AWARENESS. Actualmente, el reconocimiento del valor de puntos por pulgada está vinculado a subprocesos y a ventanas individuales, en lugar de a toda la aplicación. Estas aplicaciones usan DPI_AWARENESS.

Solo tiene que usar los valores del eje X o del eje Y al escalar la aplicación, ya que son iguales.

Para controlar este mensaje correctamente, deberá cambiar el tamaño y la posición de la ventana en función de las sugerencias proporcionadas por lParam y usar SetWindowPos. Si no lo hace, la ventana aumentará o se reducirá con respecto a todo lo demás en el nuevo monitor. Por ejemplo, si un usuario utiliza varios monitores y arrastra la ventana desde un monitor de 96 ppp a otro de 192 ppp, la ventana parecerá la mitad de grande que otros elementos del monitor de 192 ppp.

El valor base de ppp se define como USER_DEFAULT_SCREEN_DPI, que se establece en 96. Para determinar el factor de escalado de un monitor, tome el valor de puntos por pulgada y divídalo entre USER_DEFAULT_SCREEN_DPI. En la siguiente tabla encontrará algunos valores de puntos por pulgada de ejemplo y los factores de escalado asociados.

Valor de puntos por pulgada Porcentaje de escalado
96 100 %
120 125%
144 150%
192 200%

En el ejemplo siguiente se proporciona un controlador de cambio del valor de puntos por pulgada de ejemplo.

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

El siguiente código escala linealmente un valor desde el 100 % (96 ppp) a un valor de ppp arbitrario definido por g_dpi.

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

Una manera alternativa de escalar un valor es convertir el valor de puntos por pulgada en un factor de escala y usarlo.

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

Requisitos

Requisito Valor
Cliente mínimo compatible
Windows 8.1 [solo aplicaciones de escritorio]
Servidor mínimo compatible
Windows Server 2012 R2 [solo aplicaciones de escritorio]
Encabezado
Winuser.h

Consulte también

DPI_AWARENESS

PROCESS_DPI_AWARENESS