tipo tamaño programas predeterminada los letras letra iconos fuentes fuente como cambiar aumentar c++ winapi mfc font-size system-font

c++ - tamaño - fuentes de letras



No se puede detectar cuando el Tamaño de fuente de Windows ha cambiado C++ MFC (6)

[EDIT después de volver a leer] Estoy casi seguro de que cambiar a "Fuentes grandes" no causa un cambio de DPI, sino que es una configuración de tema. Debería poder verificar aplicando el cambio de "Fuentes grandes" y luego abriendo las propiedades avanzadas de pantalla donde vive la configuración de PPP, debería haber permanecido en 96 ppp.

Se supone que el cambio de DPI requiere un reinicio. Tal vez la configuración no se ha propagado a un lugar donde GetDeviceCaps puede recuperarlo?

Tal vez intente cambiar una configuración que no requiere reinicio (quizás la resolución) y luego vea si puede detectar el cambio. Si puede, su respuesta probablemente sea que no puede detectar el cambio de DPI hasta después de reiniciar.

Estoy tratando de determinar cómo puedo detectar cuando el usuario cambia el tamaño de fuente de Windows de Normal a Extra Large Fonts, el tamaño de fuente se selecciona ejecutando los siguientes pasos en una máquina con Windows XP:

  1. Haga clic derecho en el escritorio y seleccione Propiedades.
  2. Haga clic en la pestaña Aspecto.
  3. Seleccione el tamaño de fuente: Fuentes normales / grandes / Fuentes extragrandes

Según tengo entendido, el cambio en el tamaño de la fuente da como resultado un cambio de DPI, así que aquí está lo que he intentado hasta ahora.

Mi meta:

Quiero detectar cuándo el Tamaño de fuente de Windows ha cambiado de Normal a Fuentes grandes o Extra grandes y tomar algunas medidas basadas en ese cambio de tamaño de fuente. Supongo que cuando cambie el tamaño de la fuente de Windows, el DPI también cambiará (especialmente cuando el tamaño sea de fuentes extragrandes).

Lo que he intentado hasta ahora:

Recibo varios mensajes que incluyen: WM_SETTINGCHANGE, WM_NCCALCSIZE, WM_NCPAINT, etc. ... pero ninguno de estos mensajes es exclusivo de la situación cuando cambia el tamaño de la fuente; en otras palabras, cuando recibo el mensaje WM_SETTINGSCHANGE, quiero saber qué cambió.

En teoría, cuando defino OnSettingChange y Windows lo llama, lpszSection debería decirme qué es la sección de cambio, y eso funciona bien, pero luego verifico la sección dada llamando a SystemParametersInfo y paso la acción SPI_GETNONCLIENTMETRICS, y paso por el depurador y yo nos aseguramos de ver los datos en el NONCLIENTMETRICS devuelto para cualquier cambio de fuente, pero ninguno ocurre.

Incluso si eso no funcionara, aún debería poder verificar el DPI cuando la Configuración cambie. Realmente no me importarían los otros detalles, cada vez que recibo el mensaje WM_SETTINGCHANGE, simplemente verifico el DPI y realizo las acciones que me interesa realizar, pero tampoco puedo obtener el sistema DPI.

Intenté obtener el DPI invocando el método GetSystemMetrics, también para cada DC:

Dekstop DC-> GetDeviceCaps LOGPIXELSX / LOGPIXELSY Ventana DC-> GetDeviceCaps LOGPIXELSX / LOGPIXELSY DC actual-> GetDeviceCaps LOGPIXELSX / LOGPIXELSY

Incluso si cambio el DPI en la Ventana de Propiedades Gráficas estos valores no devuelven nada diferente, siempre muestran 96.

¿Alguien podría ayudarme a resolver esto, por favor? ¿Qué debería estar buscando? ¿Dónde debería estar mirando?

afx_msg void CMainFrame::OnSettingChange(UINT uFlags, LPCTSTR lpszSection) { int windowDPI = 0; int deviceDPI = 0; int systemDPI = 0; int desktopDPI = 0; int dpi_00_X = 0; int dpi_01_X = 0; int dpi_02_X = 0; int dpi_03_X = 0; CDC* windowDC = CWnd::GetWindowDC(); // try with window DC HDC desktop = ::GetDC(NULL); // try with desktop DC CDC* device = CWnd::GetDC(); // try with current DC HDC hDC = *device; // try with HDC if( windowDC ) { windowDPI = windowDC->GetDeviceCaps(LOGPIXELSY); // always 96 regardless if I change the Font // Size to Extra Large Fonts or keep it at Normal dpi_00_X = windowDC->GetDeviceCaps(LOGPIXELSX); // 96 } if( desktop ) { desktopDPI = ::GetDeviceCaps(desktop, LOGPIXELSY); // 96 dpi_01_X = ::GetDeviceCaps(desktop, LOGPIXELSX); // 96 } if( device ) { deviceDPI = device->GetDeviceCaps(LOGPIXELSY); // 96 dpi_02_X = device->GetDeviceCaps(LOGPIXELSX); // 96 } systemDPI = ::GetDeviceCaps(hDC, LOGPIXELSY); // 96 dpi_03_X = ::GetDeviceCaps(hDC, LOGPIXELSX); // 96 CWnd::ReleaseDC(device); CWnd::ReleaseDC(windowDC); ::ReleaseDC(NULL, desktop); ::ReleaseDC(NULL, hDC); CWnd::OnWinSettingChange(uFlags, lpszSection); }

El DPI siempre devuelve 96, pero los cambios de configuración SÍ tienen efecto cuando cambio el tamaño de fuente a Fuentes extragrandes o si cambio el DPI a 120 (a partir de las propiedades gráficas).


Cuando llama a GetDeviceCaps () en Desktop DC, ¿está utilizando quizás un DC que MFC podría almacenar en caché y, por lo tanto, contiene información desactualizada? ¿Estás haciendo la llamada a GetDeviceCaps () sincrónicamente desde el controlador OnSettingsChange? Pude ver cómo una o ambas de estas cosas pueden darte una versión desactualizada de DPI.

Raymond Chen escribió sobre esto y su solución se veía así (tenga en cuenta que he agregado :: operadores para evitar llamar a los contenedores de MFC de las API):

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


No creo que la pantalla DPI cambie cuando cambie el tamaño de la fuente. Windows probablemente solo está enviando los mensajes WM_PAINT y WM_NCPAINT a todas las ventanas abiertas, y están redibujándose usando la fuente del sistema actual (ahora grande).


Tengo la corazonada de que WM_THEMECHANGED se encargará de ti. Sin embargo, no tiene ninguna indicación sobre qué cambió. Deberá usar OpenThemeData y la configuración inicial de la caché, luego comparar cada vez que reciba el mensaje.

Sin embargo, probablemente no tenga que importar lo que ha cambiado, ¿no puede tener una rutina de diseño de propósito general que ajuste su forma / diálogo / lo que sea tomando todo en cuenta y suponiendo que comienza desde cero?

¿Que problema estas tratando de resolver?



Mire estos valores en el Registro:

Tema de Windows XP HKCU / Software / Microsoft / Windows / CurrentVersion / ThemeManager / SizeName Valores posibles: NormalSize, LargeFonts y ExtraLargeFonts Estos valores son independientes del idioma .

Windows Classic Theme HKCU / Panel de control / Apariencia / Current Valores posibles: Windows Classic, Windows Classic (grande), Windows Classic (extra grande), Windows Standard, Windows Standard (grande), Windows Standard (extra grande) Tenga en cuenta que estos valores son dependiente del lenguaje

Windows Vista no es compatible con esta característica. Si queremos una fuente más grande, simplemente cambie la configuración de DPI. En ese caso, GetDeviceCaps debería funcionar.

Espero que esto ayude.