2010-10-24 13 views
8

Tengo una aplicación WinForm que aloja muchas imágenes. Cuando puse la aplicación en una máquina Win7 que tiene un DPI de 120, arruina por completo el aspecto del formulario. ¿Hay alguna manera de desactivar la escala de mi formulario?C# WinForms inhabilita la escala de DPI

Soy consciente de que esto es algo que no se recomienda y que DPI debe ser transparente y manejado por el sistema operativo. Pero cuando se trata de una aplicación desollada, las imágenes no se escalan bien. No tengo el lujo de crear imágenes para todas las variaciones de DPI, así que no sugiera eso como una respuesta.

Respuesta

10

Tendrá problemas mayores cuando cambie la propiedad AutoScaleMode. Aumentar el DPI también cambia el tamaño de fuente del sistema. Necesariamente, los tamaños de fuente se expresan en puntos, 1/72 de pulgada. Las fuentes deben ser más grandes para obtener el mismo tamaño de punto cuando el DPI aumenta y mantener el texto legible de la misma manera.

Como los controles ya no cambian de tamaño, el texto en, por ejemplo, un botón ya no cabe. Una forma de combatir esto es cambiar proporcionalmente el tamaño de fuente en los controles. Es fácil si permite que todos los controles hereden la fuente del formulario, simplemente al cambiar la propiedad Fuente del formulario también se actualizan automáticamente los controles. La clara desventaja es que el usuario tendrá más dificultades para leer el texto. Esto especialmente se pone mal cuando el DPI llega a 150 puntos por pulgada y más, su UI se convierte en un sello de correo inutilizable.

Sí, las imágenes de fondo deben escalarse para ajustarse al control o formulario más grande. Un píxel en la imagen ahora ya no se asigna uno a uno a un píxel del monitor. El valor predeterminado de Graphics.InterpolationMode hace un trabajo bastante decente al filtrar la imagen. Pero depende del tipo de imagen que tan bien resulte. Una foto casi siempre se escala muy bien. El arte y el texto de línea finamente detallados no. Escoger el tipo correcto de imagen evita en gran medida tener que crear otros por separado.

Este problema no va a desaparecer hasta que los monitores comiencen a tener el tipo de resolución que tiene una impresora. Todavía estamos muy lejos de los 600 ppp para los monitores de escritorio. Los teléfonos serán los primeros.

+1

Las pantallas de 600 DPI se están convirtiendo en realidad. Solo mira tu teléfono (vale, no 600 pero 480 están aquí). El futuro está aquí. – Hooch

3

Puede establecer la propiedad AutoScaleMode del formulario en None.

+7

He intentado esto con un éxito limitado. – MarkP

+0

Combinando esto con escalar manualmente las fuentes de los controles (como se sugirió en otra solución aquí) me solucionó el problema. – Zarat

3

Adición de una línea de código antes de la llamada auto-generado a InitializeComponent en el Form1 constructor resuelto por mí:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     // Make the GUI ignore the DPI setting 
     Font = new Font(Font.Name, 8.25f * 96f/CreateGraphics().DpiX, Font.Style, Font.Unit, Font.GdiCharSet, Font.GdiVerticalFont); 
     InitializeComponent(); 
    } 
} 
+0

No funciona en absoluto en Windows 10 con un monitor 4K escalado al 150% – SlapY

+0

Combinando esto con la configuración de AutoScaleMode en None resolvió el problema para mí – Zarat

Cuestiones relacionadas