Crear una aplicación compatible con DPI
Tengo una aplicación de formulario en C#. Cuando cambio el DPI del monitor, todos los controles se mueven. Utilicé el código this.AutoScaleMode = AutoScaleMode.Dpi
, pero no evitó el problema.
¿Alguien tiene alguna idea?
EDITAR: A partir de .NET 4.7, Windows Forms ha mejorado la compatibilidad con High DPI. Lea más sobre esto en learn.microsoft.com. Sin embargo, solo funciona para Win 10 Creators Update y versiones posteriores, por lo que es posible que no sea factible usarlo todavía dependiendo de su base de usuarios.
Difícil, pero no imposible. Por supuesto, su mejor opción es pasar a WPF, pero puede que eso no sea factible.
He pasado MUCHO tiempo con este problema. Aquí hay algunas reglas/pautas para que funcione correctamente sin un FlowLayoutPanel o TableLayoutPanel:
- Edite/diseñe siempre sus aplicaciones en 96 DPI (100%) predeterminados. Si diseña en 120 DPI (125% f.ex), se pondrá realmente malo cuando vuelva a 96 DPI para trabajar con él más tarde.
- He usado AutoScaleMode.Font con éxito, no he probado mucho AutoScaleMode.DPI.
- Asegúrese de utilizar el tamaño de fuente predeterminado en todos sus contenedores (formularios, paneles, pestañas, controles de usuario, etc.). 8,25 píxeles. Preferiblemente, no debería configurarse en el archivo .Designer.cs para todos los contenedores, de modo que utilice la fuente predeterminada de la clase de contenedor.
- Todos los contenedores deben usar el mismo AutoScaleMode
- Asegúrese de que todos los contenedores tengan la siguiente línea configurada en el archivo Designer.cs:
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); // for design in 96 DPI
- Si necesita establecer diferentes tamaños de fuente en etiquetas/cuadros de texto, etc., configúrelos por control en lugar de configurar la fuente en la clase de contenedor porque winforms usa la configuración de fuente de los contenedores para escalar su contenido y tener, por ejemplo, un panel con un tamaño de fuente diferente. de lo que contiene la forma está garantizado que causará problemas. Podría funcionar si el formulario y todos los contenedores del formulario usan el mismo tamaño de fuente, pero no lo he probado.
- Utilice otra máquina o una instalación virtual de Windows (VMware, Virtual PC, VirtualBox) con una configuración de DPI más alta para probar su diseño de inmediato. Simplemente ejecute el archivo .exe compilado desde la carpeta /bin/Debug en la máquina DEV.
Te garantizo que si sigues estas pautas estarás bien, incluso cuando hayas colocado controles con anclajes específicos y no uses un panel de flujo. Tenemos una aplicación creada de esta manera implementada en cientos de máquinas con diferentes configuraciones de DPI y ya no tenemos ninguna queja. Todos los tamaños de formularios/contenedores/cuadrículas/botones/campos de texto, etc. están escalados correctamente al igual que la fuente. Las imágenes también funcionan, pero tienden a pixelarse un poco con un DPI alto.
EDITAR: este enlace tiene mucha información buena, especialmente si elige utilizar AutoScaleMode.DPI: enlace a una pregunta relacionada con stackoverflow
nota: esto no solucionará el movimiento de los controles cuando cambien los ppp. ¡¡Esto solo arreglará el texto borroso!!.
Cómo arreglar Windows Forms borrosos en configuraciones de alto ppp:
- Vaya al diseñador de formularios, luego seleccione su formulario (haciendo clic en su barra de título)
- Presione F4 para abrir la ventana Propiedades,
- luego localice la propiedad AutoScaleMode
- Cámbielo de Fuente (predeterminado) a Dpi .
Ahora, vaya a Program.cs (o el archivo donde se encuentra su método principal) y cámbielo para que se vea así:
namespace myApplication
{
static class Program
{
[STAThread]
static void Main()
{
// ***this line is added***
if (Environment.OSVersion.Version.Major >= 6)
SetProcessDPIAware();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
// ***also dllimport of that function***
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool SetProcessDPIAware();
}
}
Guardar y compilar. Ahora tu forma debería verse crujiente nuevamente.
fuente: http://crsouza.com/2015/04/13/how-to-fix-blurry-windows-forms-windows-in-high-dpi-settings/