Saltar al contenido

¿Cómo configurar una aplicación para que se ejecute correctamente en una máquina con una configuración alta de DPI (por ejemplo, 150%)?

Solución:

Una vez que supere el 100% (o el 125% con la casilla de verificación “Escala de DPI al estilo XP” marcada), Windows de forma predeterminada asume el control de la escala de su interfaz de usuario. Lo hace haciendo que su aplicación represente su salida en 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 los programas antiguos utilizables en monitores de alta resolución.

Debe hacerle saber explícitamente que puede manejar configuraciones de DPI más altas agregando el <dpiAware> elemento 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 elemento, seleccione “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 pinvoke 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();

ACTUALIZAR, esta necesidad común es finalmente un poco más fácil si usa VS2015 Update 1 o superior. El manifiesto agregado ya tiene la directiva relevante, simplemente elimine los comentarios.


Palabra clave para la búsqueda para poder encontrar esta publicación: dpiAware

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 será predeterminado). En este caso, el sistema operativo renderizará nuestra aplicación bajo la esperado 96 DPI y luego lo hará con la escala de mapa de bits que discutimos antes. 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 se procese de acuerdo con el DPI original de la pantalla. En el caso de un entorno de DPI por monitor, su aplicación se renderizará 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 de escala, pero es posible que aún note algo de confusión.

Si desea evitar eso, debe declarar su aplicación como compatible con DPI por monitor. Luego debes detectar cuando tu aplicación es arrastrada por diferentes monitores y renderizar según el DPI del actual.

La declaración de reconocimiento de DPI se realiza en un archivo de manifiesto.

consulte el siguiente enlace stackoverflow

Con .NET Framework 4.7 y Windows 10 Creators Update (1703) o más reciente, debe hacer lo siguiente para configurar el soporte de alto DPI para su aplicación de Windows Form:

Declare compatibilidad con Windows 10.

Para hacer esto, agregue lo siguiente a su manifest expediente:

<compatibility xmlns="urn:schemas-microsoft.com:compatibility.v1">
  <application>
    <!-- Windows 10 compatibility -->
    <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
  </application>
</compatibility>

Habilite el reconocimiento de DPI por monitor en el app.config expediente.

Windows Forms presenta un nuevo elemento System.Windows.Forms.ApplicationConfigurationSection para admitir nuevas características y personalizaciones agregadas a partir de .NET Framework 4.7. Para aprovechar las nuevas funciones que admiten un DPI alto, agregue lo siguiente al archivo de configuración de su aplicación.

<System.Windows.Forms.ApplicationConfigurationSection>
  <add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>

Importante

En versiones anteriores de .NET Framework, usó el manifiesto para agregar soporte de DPI alto. Este enfoque ya no se recomienda, ya que anula la configuración definida en el archivo app.config.

Llame al método estático EnableVisualStyles.

Esta debería ser la primera llamada al método en el punto de entrada de su aplicación. Por ejemplo:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());   
}

La ventaja de esto es la compatibilidad con escenarios de DPI dinámicos en los que el usuario cambia el DPI o el factor de escala después de que se haya lanzado una aplicación de Windows Forms.

Fuente: Soporte de alto DPI en Windows Forms

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *