2008-11-18 36 views
34

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

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

Respuesta

14

Echa un vistazo a esto blog entry hablando de la fuente predeterminada en los 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).

11

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

No hay ningún procedimiento documentado que conozca para cambiar esa fuente predeterminada, los documentos del SDK mencionan MS Sans Serif explícitamente. Si quieres Segoe, tendrás que pedirlo. Lo cual no es tan seguro de hacer, 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 qué aparece, ya no me queda esa máquina.

+0

Eso es realmente triste. :( – wasker

30

Se pueden añadir antes de InitializeComponent() en el constructor (s) Forma:

this.Font = SystemFonts.MessageBoxFont; 

Esto parece funcionar con Windows XP y Windows Vista.

+0

Sí, esta es la solución alternativa que suelo usar. – Lucas

1

Estableciendo 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. Lo "solucioné" estableciendo la propiedad Font en SystemFonts.DialogFont para cada cuadro de grupo.

41

La respuesta aceptada no responde realmente a la pregunta; simplemente explica por qué está ocurriendo este comportamiento.

Algunas de las otras respuestas proponen soluciones provisionales sólidas, pero he descubierto que la mejor solución es crear una base que todos los formularios de la aplicación hereden y establecer la propiedad Font de este formulario base en SystemFonts.MessageBoxFont en constructor. Esto no solo garantiza que su aplicación obtenga la fuente correcta en tiempo de ejecución, en función del entorno del usuario (evitando el posible problema planteado por Hans Passant; un XP sin Office 2007 recurrirá a Microsoft Sans Serif en ausencia de Segoe UI).), pero también le brinda tiempo de diseño compatible con su fuente actual de Windows. Usar la fuente correcta en el momento del 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 el momento del 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 darle un lugar para poner otra funcionalidad común . Utilizo esto de varias maneras diferentes, como p/invocación, etc. para corregir errores en la implementación de WinForms.

El único problema que queda con este enfoque es si desea establecer un estilo de fuente para un control en particular, como en negrita.El mejor lugar para hacer esto se encuentra todavía en el constructor de esa forma, a partir de la fuente de la forma como base y la modificación del estilo de ella:

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

Los controles dentro del cuadro de grupo de hecho no se ven afectados por la propiedad de 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. A fin de que todos los controles incluidos los de groupboxes a escala adecuada, se puede utilizar un código similar a continuación:

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

Prueba de esto, Haga clic en un formulario y cambiar el tamaño de fuente, por ejemplo, he cambiado un tamaño de fuente de la Forma a 12 puntos y luego prueba arrastrando el cuadro de texto al formulario. Verás, el tamaño del cuadro de texto también se cambia a 12pt. Acabo de obtener esta solución por accidente.

+0

¿Notaste que se hizo una pregunta en 2008? Es bastante tarde respuesta –

+2

Sí, ya veo, pero en 2015 todavía necesito la respuesta a esta pregunta y Puedo resolver este problema por accidente, como dije. Por lo tanto, creo que debería contar esta solución a otras personas que probablemente tengan el mismo problema que yo. –

1

El Control.DefaultFont es ReadOnly; un hacky debía sobrescribirlo 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)); 

estar seguro de tener un UT mantener un ojo en este código, no hay contrato API para protegerle si los cambios en la implementación Marco.

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

Cuestiones relacionadas