c# .net winforms graphics scale

c# - Problema gráfico de Windows Forms en el sistema operativo Windows 10



.net winforms (1)

Cuando ejecuto cualquier aplicación de Windows Forms en Windows 10, los gráficos dentro de la ventana parecen estar distorsionados:

En tiempo de diseño esto no sucede:

¿Alguien ha experimentado esto?

(Por favor, abra las imágenes para ver mejor).


Para resolver el problema, puede hacer que su aplicación sea compatible con DPI utilizando cualquiera de estas opciones:

  • Uso del archivo de manifiesto de la aplicación
  • Usando SetProcessDPIAware

Uso del archivo de manifiesto de la aplicación

Para que la aplicación sea compatible con DPI, puede agregar un archivo de manifiesto de aplicación a su proyecto. Luego, en el archivo app.manifest , app.manifest el comentario de la parte relacionada con la conciencia de DPI:

<application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware> </windowsSettings> </application>

Luego, en su archivo app.config , agregue EnableWindowsFormsHighDpiAutoResizing estableciendo su valor en verdadero:

<appSettings> <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" /> </appSettings>

Para obtener más información, consulte la página High DPI MSDN.

Usando SetProcessDPIAware

Puede usar el método SetProcessDPIAware() antes de mostrar su formulario principal para que su aplicación tenga en cuenta el dpi y evitar que Windows escale la aplicación. También debe verificar que la versión de Windows sea mayor o igual que Vista:

static class Program { [DllImport("user32.dll", SetLastError = true)] static extern bool SetProcessDPIAware(); /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { if (Environment.OSVersion.Version.Major >= 6) SetProcessDPIAware(); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(true); Application.Run(new Form1()); } }

Nota

Si bien anteriormente utilicé el método SetProcessDPIAware para resolver el problema, pero leí la nota antes de usar:

SetProcessDPIAware está sujeto a una posible condición de carrera si una DLL almacena en caché la configuración de dpi durante la inicialización. Por esta razón, se recomienda configurar el SetProcessDPIAware dpi a través del manifiesto de la aplicación (.exe) en lugar de llamar a SetProcessDPIAware .

SetProcessDPIAware está disponible para su uso solo en los sistemas operativos especificados en la sección Requisitos. Este método puede tener un comportamiento inesperado en versiones posteriores del sistema operativo. Utilice SetProcessDpiAwareness en SetProcessDpiAwareness lugar.

Las DLL deben aceptar la configuración de dpi del proceso de host en lugar de llamar a SetProcessDPIAware . Para configurarse correctamente, dpiAware debe especificarse como parte del manifiesto de la aplicación (.exe).