Impossibile rilevare quando la dimensione del carattere di Windows è stata modificata in C++ MFC

 C Programming >> Programmazione C >  >> Tags >> MFC
Impossibile rilevare quando la dimensione del carattere di Windows è stata modificata in C++ MFC

[EDIT dopo la rilettura] Sono quasi sicuro che il passaggio a "Caratteri grandi" non causi una modifica DPI, piuttosto è un'impostazione del tema. Dovresti essere in grado di verificare applicando la modifica "Caratteri grandi" e quindi aprendo le proprietà di visualizzazione avanzate in cui risiede l'impostazione DPI, dovrebbe essere rimasta a 96 dpi.

La modifica DPI dovrebbe richiedere un riavvio. Forse l'impostazione non si è propagata in un luogo in cui GetDeviceCaps può recuperarla?

Forse prova a modificare un'impostazione che non richiede il riavvio (forse risoluzione) e poi vedi se riesci a rilevare la modifica. Se puoi, la tua risposta è probabilmente che non puoi rilevare la modifica DPI fino a dopo il riavvio.


Quando si chiama GetDeviceCaps() sul controller di dominio desktop, si utilizza forse un controller di dominio che potrebbe essere memorizzato nella cache da MFC e pertanto contiene informazioni non aggiornate? Stai effettuando la chiamata GetDeviceCaps() in modo sincrono dall'interno del tuo gestore OnSettingsChange? Ho potuto vedere come una o entrambe queste cose potrebbero farti ottenere una versione obsoleta di DPI.

Raymond Chen ne ha scritto e la sua soluzione era simile a questa (nota che ho aggiunto ::operatori per evitare di chiamare i wrapper MFC delle API):

int GetScreenDPI()
{
  HDC hdcScreen = ::GetDC(NULL);
  int iDPI = -1; // assume failure
  if (hdcScreen) {
    iDPI = ::GetDeviceCaps(hdcScreen, LOGPIXELSX);
    ::ReleaseDC(NULL, hdcScreen);
  }
  return iDPI;
}

Ho la sensazione che WM_THEMCHANGED si prenderà cura di te. Tuttavia, non ha alcun indizio su cosa sia cambiato. Dovrai utilizzare OpenThemeData e le impostazioni iniziali della cache, quindi confrontare ogni volta che ricevi il messaggio.

Probabilmente non devi preoccuparti di cosa è cambiato, non puoi avere una routine di layout generica che aggiusti il ​​tuo modulo/finestra di dialogo/qualsiasi cosa tenendo conto di tutto e presuppone che inizi da zero?

Quale problema stai cercando di risolvere?