Dirija su aplicación para .Net Framework 4.7 y ejecútela en Windows 10 v1703 (Creators Update Build 15063). Con .Net 4.7 en Windows 10 (v1703), MS realizó muchas mejoras en DPI .
Comenzando con .NET Framework 4.7, Windows Forms incluye mejoras para escenarios comunes de DPI alto y DPI dinámico. Éstos incluyen:
Mejoras en la escala y el diseño de varios controles de formularios Windows Forms, como el control MonthCalendar y el control CheckedListBox.
Escalado de una sola pasada. En .NET Framework 4.6 y versiones anteriores, el escalado se realizó a través de múltiples pases, lo que provocó que algunos controles se escalaran más de lo necesario.
Soporte para escenarios dinámicos de DPI 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.
Para admitirlo, agregue un manifiesto de aplicación a su aplicación y señale que su aplicación es compatible con Windows 10:
<compatibility xmlns="urn:schemas-microsoft.comn:compatibility.v1">
<application>
<!-- Windows 10 compatibility -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
A continuación, agregue un app.config
y declare la aplicación Per Monitor Aware. ¡Esto se hace AHORA en app.config y NO en el manifiesto como antes!
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
Este PerMonitorV2 es nuevo desde Windows 10 Creators Update:
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
También conocido como por monitor v2. Un avance sobre el modo de reconocimiento de DPI por monitor original, que permite a las aplicaciones acceder a nuevos comportamientos de escalado relacionados con DPI en cada ventana de nivel superior.
Notificaciones de cambio de DPI de ventana secundaria : en contextos por monitor v2, se notifica a todo el árbol de ventana de cualquier cambio de DPI que ocurra.
Escalado del área no cliente : todas las ventanas tendrán automáticamente su área no cliente dibujada de manera sensible a DPI. Las llamadas a EnableNonClientDpiScaling son innecesarias.
S titulándose de menús Win32 - Todos los menús creados en contextos NTUSER por monitor v2 será escalando de una forma per-monitor.
Escala de diálogo : los cuadros de diálogo Win32 creados en contextos por monitor v2 responderán automáticamente a los cambios de DPI.
Escala mejorada de controles comctl32 : varios controles comctl32 han mejorado el comportamiento de escala de DPI en contextos por monitor v2.
Comportamiento de temática mejorado : los identificadores UxTheme abiertos en el contexto de una ventana Por monitor v2 funcionarán en términos de DPI asociado con esa ventana.
Ahora puede suscribirse a 3 nuevos eventos para recibir notificaciones sobre los cambios de DPI:
Control.DpiChangedAfterParent , que se activa Se produce cuando la configuración de DPI para un control se cambia programáticamente después de que se haya producido un evento de cambio de DPI para su control o formulario principal.
Control.DpiChangedBeforeParent , que se activa cuando la configuración de DPI para un control se cambia programáticamente antes de que ocurra un evento de cambio de DPI para su control o formulario principal.
Form.DpiChanged , que se activa cuando la configuración de DPI cambia en el dispositivo de visualización donde se muestra actualmente el formulario.
También tiene 3 métodos auxiliares sobre el manejo / escalado de DPI:
Control.LogicalToDeviceUnits , que convierte un valor de lógico a píxeles del dispositivo.
Control.ScaleBitmapLogicalToDevice , que escala una imagen de mapa de bits al DPI lógico para un dispositivo.
Control.DeviceDpi , que devuelve el DPI para el dispositivo actual.
Si sigue apareciendo problemas, puede darse de baja de las mejoras DPI a través de las entradas app.config .
Si no tiene acceso al código fuente, puede ir a las propiedades de la aplicación en el Explorador de Windows, ir a compatibilidad y seleccionar System (Enhanced)
que activa la escala de GDI para mejorar también el manejo de DPI:
Para las aplicaciones que están basadas en GDI, Windows ahora puede escalarlas DPI por monitor. Esto significa que estas aplicaciones serán, mágicamente, conscientes de DPI por monitor.
Siga todos esos pasos y debería obtener una mejor experiencia DPI para las aplicaciones WinForms. Pero recuerde, debe orientar su aplicación a .net 4.7 y necesita al menos Windows 10 Build 15063 (Actualización de creadores). En la próxima actualización de Windows 10 1709, podríamos obtener más mejoras.
NumericUpDown
no escalaMargin
adecuadamente, también. Parece que el margen se escala dos veces. Si lo escalo una vez, se ve bien.