c# - resolucion - ¿Cómo configurar una aplicación para que se ejecute correctamente en una máquina con una configuración de DPI alta(por ejemplo, 150%)?
ajustar tamaño de formulario c# (3)
Creé una aplicación simple de Winforms en C #. Cuando ejecuto la aplicación en una máquina con una configuración de DPI alta (por ejemplo, 150%), la aplicación se amplía. ¡Hasta aquí todo bien! Pero en lugar de renderizar las fuentes con un tamaño de letra mayor, todos los textos también se amplían. Eso, por supuesto, conduce a un texto muy borroso (en todos los controles, como botones, etc.).
¿No deberían las ventanas encargarse de reproducir los textos correctamente? Por ejemplo, la barra de título de mi aplicación se muestra nítida y clara.
Las aplicaciones se pueden desarrollar en dos modos diferentes.
El primero es declarar que nuestra aplicación no es compatible con DPI (no declarar nada por defecto). En este caso, el sistema operativo representará nuestra aplicación por debajo de los 96 DPI previstos y luego se aplicará a la escala de mapa de bits que discutimos anteriormente. El resultado será una aplicación de aspecto borroso, pero con un diseño correcto.
La segunda opción es declarar la aplicación como compatible con DPI. En este caso, el sistema operativo no hará ninguna escala y permitirá que su aplicación rinda de acuerdo con el DPI original de la pantalla. En el caso de un entorno por monitor-DPI, su aplicación se representará con el DPI más alto de todas las pantallas, luego este mapa de bits se reducirá al tamaño adecuado para cada monitor. La reducción de escala da como resultado una mejor experiencia de visualización que la ampliación, pero es posible que aún note cierta falta de claridad.
Si desea evitar eso, debe declarar su aplicación como per-monitor-DPI-aware. Luego debe detectar cuándo se arrastra su aplicación a través de diferentes monitores y renderizar de acuerdo con el DPI del actual.
Declarar que el reconocimiento de DPI se realiza en un archivo de manifiesto.
Ninguna de estas sugerencias funcionó para mí, pero algo sucedió después de que Form.Font = new
... de Form.Design.cs
, el formulario comenzó a volver a escalar correctamente, funciona si la fuente está definida en el constructor. o no en absoluto. ¿Por qué? alguien más puede ser explicado, solo puedo hablar sobre el cambio que hice y me tomó unos minutos darme cuenta de que era la causa raíz del formulario en el que estaba trabajando. Espero eso ayude.
Una vez que haya pasado el 100% (o el 125% con la casilla de verificación "escala XP de estilo XP" marcada), Windows asume de forma predeterminada la escala de su interfaz de usuario. Lo hace haciendo que su aplicación muestre su salida a un mapa de bits y dibuje ese mapa de bits en la pantalla. El cambio de escala de ese mapa de bits hace que el texto se vea inevitablemente borroso. Una característica llamada "virtualización DPI", mantiene viejos programas utilizables en monitores de alta resolución.
<dpiAware>
explícitamente que puede manejar una configuración más alta de DPI agregando el elemento <dpiAware>
a su manifiesto. La página de MSDN está aquí, pero no está completa, ya que omite la configuración de UAC. Proyecto + Agregar nuevo artículo, elija "Archivo de manifiesto de aplicación". Edite el texto del manifiesto o copie / pegue esto:
<?xml version="1.0" encoding="utf-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>
También puede pintar SetProcessDPIAware () en su método Main (), necesario por ejemplo si implementa con ClickOnce:
[STAThread]
static void Main() {
if (Environment.OSVersion.Version.Major >= 6) SetProcessDPIAware();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1()); // Edit as needed
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool SetProcessDPIAware();
ACTUALIZACIÓN, esta necesidad común es finalmente un poco más fácil si usa VS2015 Actualización 1 o superior. El manifiesto agregado ya tiene la directiva correspondiente, solo elimine los comentarios.
Palabra clave de búsqueda para que pueda encontrar esta publicación de nuevo: dpiAware