2010-11-03 38 views
25

Necesito una manera rápida de forzar a mi aplicación C# Windows Forms a no escalar las fuentes cuando un usuario elige un porcentaje mayor o menor en la configuración del sistema operativo.¿Cómo forzo a una aplicación Windows Forms C# a ignorar cuando un usuario elige 125% o 150% para el tamaño de fuente del sistema operativo?

¿Esto es posible?

+0

¿Por qué quieres actuar en contra de los deseos del usuario? – CodesInChaos

+13

Posiblemente porque arrojará las vistas y tendrá desbordamientos que serán difíciles de solucionar para cada caso. Sería una solución más rápida para simplemente "tamaño de fuerza de manta". Es una solución de parche, como dijiste, porque no es lo mejor para el usuario, pero ese es mi 2c. – eggy

Respuesta

2

Ir en contra de los deseos del usuario ya que esto no es algo que MS acoja con impaciencia.

En lugar de corregir el síntoma (su aplicación no escala correctamente), ¿no sería probablemente igual de rápido para solucionar el problema? Cuando un usuario selecciona fuentes más grandes, generalmente es porque necesitan las letras más grandes para poder leerlas; por lo tanto, escalar correctamente es más importante que no escalar y permanecer ilegible para el usuario.

+0

no es la pregunta "cómo obligar a no autoescalar", mientras que usted está sugiriendo que no lo haga? – sudarsanyes

+0

Estaba sugiriendo que la escala de la aplicación sea correcta, en lugar de encontrar una forma de desobedecer la configuración de Windows del usuario. –

+5

No creo que esto responda la pregunta. Si bien es útil decir que "XYZ no se debe hacer", no es útil decir "no se puede hacer XYZ" a menos que no se pueda hacer XYZ. Esta respuesta podría funcionar como un comentario a la pregunta original, pero no como una respuesta. – mrmillsy

2

No. GDI y Windows Forms dependen de la resolución. La mejor opción es diseñar sus diseños de manera que escalen apropiadamente cuando se cambia el tamaño de una ventana. Esto también permite que la escala de tamaño de fuente funcione correctamente, ya que los diseños se ajustarán según sea necesario.

Esto, por cierto, es una de las grandes mejoras en WPF: está diseñado para ser independiente de la resolución.

2

sospecho que ya ha probado

yourform.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; 

en sus formas, lo que impide a sus formas de escalar, pero no sus fuentes. Entonces, lo que tiene que hacer (incluso si no se recomienda, vea las otras publicaciones) es establecer el tamaño de fuente para todos los controles en su formulario a un tamaño fijo:

Aquí hay un fragmento de código para tomar todos los controles de un forma:

public List<Control> FindAllControls(Control container) 
    { 
     List<Control> controlList = new List<Control>(); 
     FindAllControls(container, controlList); 
     return controlList; 
    } 

    private void FindAllControls(Control container, IList<Control> ctrlList) 
    { 
     foreach (Control ctrl in container.Controls) 
     { 
      if (ctrl.Controls.Count == 0) 
       ctrlList.Add(ctrl); 
      else 
       FindAllControls(ctrl, ctrlList); 
     } 
    } 

Bajo http://www.csharp411.com/change-font-size/ se encuentra un enlace de cómo cambiar el tamaño de fuente de un control, especialmente cuando se desea utilizar píxeles de tamaño fijo. Creo que con estas herramientas puedes conectarlas por tu cuenta.

EDITAR: No olvide decir: si finalmente va a no ignorar el tamaño de fuente del sistema operativo y utilizar AutoScaleMode como se esperaba: esto tiene algunos caprichos, vea my previous post here on SO.

15

El problema es que la propiedad de fuente de un formulario o un control especifica el tamaño de fuente en los puntos. Esa es una medida que afecta la altura de las letras cuando cambia la configuración de DPI. Un punto es 1/72 pulgadas. El DPI por defecto, 96 puntos por pulgada y un tamaño de fuente de 9 puntos produce una letra que es 9/72 x 96 = 12 píxeles de alto.

Cuando el usuario aumenta la configuración de PPP a, por ejemplo, 120 DPI (125%), la letra se convierte en 9/72 x 120 = 15 píxeles de alto. Si no permite que el control aumente, el texto ya no cabe en el control. Muy feo para mirar.

La propiedad Form.AutoScaleMode soluciona este problema. Comprueba a qué tamaño se diseñó el formulario y lo compara con el DPI en la máquina en la que se ejecuta. Y cambia el tamaño y reubica los controles para asegurar que este tipo de recorte no ocurra. Muy útil, es completamente automático sin que tengas que hacer nada al respecto.

El problema típico es el bit de "reubicación" en el párrafo anterior. Si le da a los controles su propio tamaño de fuente en lugar de heredar el tamaño del formulario o si el diseño automático del formulario no es kosher, los controles pueden terminar en el lugar equivocado, destruyendo el aspecto organizado del formulario.

Tiene que corregir eso, no está claro por su pregunta cuál podría ser el origen del problema. Intentar evitar que este escalado automático haga su trabajo no es sostenible. Tendrá que repetir todos los controles en el formulario y cambiar su fuente, eligiendo un tamaño de letra más pequeño. Sin embargo, esto te meterá en problemas dentro de un par de años, si no es que ya lo has hecho. Su usuario se va a quejar de tener que trabajar con un sello postal.

La forma más fácil de depurar el problema de diseño, evitando el dolor de cambiar constantemente el tamaño DPI, es para pegar temporalmente este código en tu clase formulario:

protected override void OnLoad(EventArgs e) { 
     this.Font = new Font(this.Font.FontFamily, this.Font.SizeInPoints * 125/96); 
     base.OnLoad(e); 
    } 
+0

+1. Pero me gustaría agregar que heredar una fuente modificada por los controles contenidos hace que AutoScaleMode no funcione como estaba previsto, vea el enlace al final de mi respuesta. Como solución, uno tiene que cambiar las fuentes de todos los controles de forma explícita. –

24

Esto es lo que funcionó para mí ...

 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; 
     this.Font = new System.Drawing.Font("Arial", 14F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Pixel, ((byte)(0))); 

Las dos líneas anteriores se copian de mi archivo BaseForm.Designer.cs, pero básicamente me encontré con dos sencillos pasos para conseguir "sin escala de fuentes":

  1. Establezca AutoScaleMode en Ninguno.

  2. Utilice "Pixel" como el Tipo de unidad para todas las fuentes, en lugar del valor de punto predeterminado.

Por lo que si debe dejar que Windows escale sus fuentes o no, eso depende de usted. Por mi parte, no me gusta el diseño, así que si siento que mi aplicación necesita ser escalada, lo haré yo mismo, con mis propias opciones y diseño.

A lo largo de los años de hablar con los usuarios finales reales, también he descubierto que la mayoría de ellos no tienen idea acerca de la configuración de DPI, y si tienen algo diferente al conjunto predeterminado, no era porque lo quisieran de esa manera ... y simplemente nunca lo notaron porque todo lo que usan es el navegador web y tal vez Excel y Microsoft Word (que usan cualquier fuente que le hayan asignado).

Si mi aplicación ha respetado la configuración de fuente del sistema, no les hubiera gustado tanto == menos ventas, porque habría tenido esta gran fuente fea como los diálogos del sistema (y no saben cómo para cambiarlo, pero no les importan los diálogos del sistema que nunca usan).

+0

La fórmula siguiente se puede usar para determinar el tamaño de fuente en píxeles: pixel_size == point_size * 96/72 // para 96 ​​ppp ... 100% – Bachor

6

Encontré una solución bastante fácil.

this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); 

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; 

Esto hará que el texto tenga el mismo tamaño independientemente del tamaño de autoescala.

+3

¿En qué etapa del ciclo de vida del control/formulario está configurado? En el Constructor? La rutina InitializeComponent? – DarrenMB

1
  • En Windows 8.0, incluso si se establece la Unidad de fuente como de píxeles, con el AutoScaling establece en Ninguno, se Auto Scaling.
  • En Windows 7, la misma aplicación no se escala automáticamente.

Por lo tanto, la única manera de no permitir que su texto se escale automáticamente en Windows 7 es establecer la Unidad de fuente como Píxel y la propiedad Autoescalar de la ventana como Ninguna.

Y en Windows 8.0, supongo que no tiene más remedio que establecer los ppp a los ppp de la máquina del desarrollador y pedirle al usuario que nunca lo cambie.

Cuestiones relacionadas