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