Pregunta

Cada vez que creo un nuevo formulario en mi aplicación, utiliza el "Microsoft Sans Serif, 8.25pt". fuente por defecto. No lo estoy cambiando porque sé que en este caso mi formulario debería elegir la fuente predeterminada para el sistema. Sin embargo, cuando ejecuto mi aplicación, la fuente que se usa sigue siendo cualquier cosa menos Segoe UI (mi fuente de sistema predeterminada en mi sistema operativo Windows Vista).

¿Por qué sucede esto? ¿Cómo me aseguro de que mi aplicación se parece a una aplicación normal de Windows?

¿Fue útil?

Solución

Echa un vistazo a esta entrada del blog hablando sobre el fuente predeterminada en formularios que conduce al problema que está experimentando y este Connect Bug con la respuesta de Microsoft. En resumen, parece que Forms no obtiene la fuente de Windows predeterminada (correcta) (que ha cambiado).

Otros consejos

La respuesta aceptada realmente no responde la pregunta; solo explica por qué ocurre este comportamiento.

Algunas de las otras respuestas proponen soluciones sólidas, pero he descubierto que la mejor solución es crear un formulario base del que hereden todos los formularios de su aplicación y establecer la propiedad Font de este formulario base en SystemFonts .MessageBoxFont en el constructor. Esto no solo garantiza que su aplicación elija la fuente correcta en tiempo de ejecución, en función del entorno del usuario (evitando el posible problema planteado por Hans Passant & # 8212; un XP sin Office 2007 recurrirá a Microsoft Sans Serif en ausencia de Segoe UI), pero también le brinda soporte en tiempo de diseño para su fuente de Windows actual. Usar la fuente correcta en tiempo de diseño resuelve el problema que señala Josuegomes, porque cualquier control de contenedor que se cree en el formulario recogerá la fuente utilizada por el formulario en tiempo de diseño.

Además de las ventajas anteriores, esto le libera de tener que recordar modificar el constructor para cada formulario que crea y garantiza la coherencia en todos los formularios de su aplicación, además de brindarle un lugar para colocar otras funcionalidades comunes. Utilizo esto de dos maneras diferentes, como p / invocar, etc., para corregir errores en la implementación de WinForms.

El único problema que persiste con este enfoque es si desea establecer un estilo de fuente para un control en particular, como negrita. El mejor lugar para hacer esto todavía está en el constructor de ese formulario, comenzando con la fuente del formulario como base y modificando el estilo a partir de ella:

myControl.Font = New Font(Me.Font, FontStyle.Bold)

Puede agregar antes de InitializeComponent () en el (los) constructor (es) de formulario:

this.Font = SystemFonts.MessageBoxFont;

Esto parece funcionar con Windows XP y Windows Vista.

Sí, utiliza la fuente devuelta por GetStockObject (DEFAULT_GUI_FONT) . Que es MS Sans Serif. Una fuente antigua, desaparecida de la mayoría de las máquinas. El mapeador de fuentes lo traduce, no sorprende, a Microsoft Sans Serif.

No conozco ningún procedimiento documentado para cambiar esa fuente predeterminada, los documentos del SDK mencionan MS Sans Serif explícitamente. Si quieres a Segoe, tendrás que pedirlo. Lo que no es tan seguro, todavía hay muchas máquinas XP sin Office 2007. El mapeador de fuentes lo traducirá en una máquina que no tiene Segoe disponible. No estoy seguro de lo que sale, ya no me queda tal máquina.

Establecer la propiedad Font del formulario en SystemFonts.DialogFont no funciona si tiene cuadros de grupo con controles asociados. Los controles dentro del cuadro de grupo no se ven afectados por la propiedad Fuente del formulario. I " resuelto " esto configurando la propiedad Font en SystemFonts.DialogFont para cada cuadro de grupo.

Los controles dentro del cuadro de grupo no se ven afectados por la propiedad Fuente del formulario. La razón es que los controles en los controles de contenedor se tratan como elementos secundarios de los controles de contenedor como groupbox, pero no como elementos secundarios del formulario principal. Para que todos los controles, incluidos los de groupboxes, se escalen correctamente, puede usar un código similar al siguiente:

        foreach (Control ctr in this.Controls)
        {
            ctr.Font = SystemFonts.IconTitleFont;

            // controls in groupboxes are not child of main form
            if (ctr.HasChildren)
            {
                foreach (Control childControl in ctr.Controls)
                {
                    childControl.Font = SystemFonts.IconTitleFont;
                }
            }        
        }

Pruebe esto, haga clic en un formulario y cambie el tamaño de fuente, por ejemplo, cambié el tamaño de fuente del formulario a 12 puntos y luego pruebe arrastrando el cuadro de texto al formulario. Verá, el tamaño del cuadro de texto también se cambia a 12 puntos. Acabo de recibir esta solución por accidente.

El Control.DefaultFont es ReadOnly; una hacky era sobrescribir es usar la reflexión.

Type settingsType = typeof(Control);
var defaultFontField = settingsType.GetField("defaultFont", BindingFlags.Static | BindingFlags.NonPublic);
defaultFontField.SetValue(null, new Font("Segoe UI", 8.25F));

Asegúrese de tener un UT vigilando este código, no hay contrato de API para protegerlo si cambia la implementación de Framework.

También tenga en cuenta el diseñador de formularios que la mayoría de las veces insertará la fuente textualmente en las clases .designer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top