WM_DPICHANGED messaggio

Inviato quando i punti effettivi per pollice (dpi) per una finestra sono cambiati. Il valore DPI è il fattore di scala per una finestra. Esistono più eventi che possono causare la modifica del valore DPI. L'elenco seguente indica le possibili cause della modifica in DPI.

  • La finestra viene spostata in un nuovo monitor con valori DPI diversi.
  • Dpi del monitor che ospita la finestra cambia.

Il valore DPI corrente per una finestra è sempre uguale all'ultimo VALORE DPI inviato da WM_DPICHANGED. Questo è il fattore di scala in cui la finestra deve essere ridimensionata per i thread che sono consapevoli delle modifiche DPI.

#define WM_DPICHANGED       0x02E0

Parametri

wParam

L'HIWORD di wParam contiene il valore dell'asse Y del nuovo dpi della finestra. LoWORD di wParam contiene il valore dell'asse X del nuovo DPI della finestra. Ad esempio, 96, 120, 144 o 192. I valori dell'asse X e dell'asse Y sono identici per le app di Windows.

lParam

Puntatore a una struttura RECT che fornisce una dimensione e una posizione suggerite della finestra corrente ridimensionata per il nuovo DPI. L'aspettativa è che le app riposizioneranno e ridimensionano le finestre in base ai suggerimenti forniti da lParam durante la gestione di questo messaggio.

Valore restituito

Se un'applicazione elabora questo messaggio, deve restituire zero.

Osservazioni:

Questo messaggio è rilevante solo per PROCESS_PER_MONITOR_DPI_AWARE applicazioni o thread DPI_AWARENESS_PER_MONITOR_AWARE. Può essere ricevuto in determinate modifiche DPI se la finestra o il processo di primo livello è in esecuzione come DPI non consapevole o dpi del sistema, ma in tali situazioni può essere ignorato in modo sicuro. Per altre informazioni sui diversi tipi di consapevolezza, vedere PROCESS_DPI_AWARENESS e DPI_AWARENESS. Le versioni precedenti di Windows richiedevano la consapevolezza dpi da collegare a livello di un'applicazione. Queste app usano PROCESS_DPI_AWARENESS. Attualmente, la consapevolezza DPI è associata a thread e singole finestre anziché all'intera applicazione. Queste app usano DPI_AWARENESS.

È sufficiente usare l'asse X o il valore dell'asse Y quando si ridimensiona l'applicazione perché sono uguali.

Per gestire correttamente questo messaggio, dovrai ridimensionare e riposizionare la finestra in base ai suggerimenti forniti da lParam e usando SetWindowPos. Se non si esegue questa operazione, la finestra cresce o si riduce rispetto a tutto il resto del nuovo monitor. Ad esempio, se un utente usa più monitor e trascina la finestra da un monitor DPI 96 a un monitor DPI 192, la finestra apparirà come metà di grandi dimensioni rispetto ad altri elementi sul monitor DPI 192.

Il valore base di DPI viene definito come U edizione StandardR_DEFAULT_SCRedizione EnterpriseN_DPI impostato su 96. Per determinare il fattore di ridimensionamento per un monitor, prendere il valore DPI e dividerlo per U edizione StandardR_DEFAULT_SCRedizione EnterpriseN_DPI. La tabella seguente fornisce alcuni valori DPI di esempio e fattori di ridimensionamento associati.

Valore DPI Percentuale di ridimensionamento
96 100%
120 125%
144 150%
192 200%

Nell'esempio seguente viene fornito un gestore di modifica DPI di esempio.

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

Il codice seguente ridimensiona in modo lineare un valore compreso tra il 100% (96 DPI) e un DPI arbitrario definito da g_dpi.

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

Un modo alternativo per ridimensionare un valore consiste nel convertire il valore DPI in un fattore di scala e usarlo.

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

Requisiti

Requisito Valore
Client minimo supportato
Windows 8.1 [solo app desktop]
Server minimo supportato
Windows Server 2012 R2 [solo app desktop]
Intestazione
Winuser

Vedi anche

DPI_AWARENESS

PROCESS_DPI_AWARENESS