Escalado automático (Windows Forms para .NET)

El escalado automático permite que un formulario y sus controles, diseñados en un equipo con una determinada resolución de pantalla o fuente, se muestren de forma correcta en otro equipo con una resolución de pantalla o una fuente diferentes. El escalado automático garantiza que el formulario y sus controles cambien de tamaño para mantener la coherencia con las ventanas nativas y otras aplicaciones tanto en máquinas de los usuarios como en las de otros desarrolladores. El escalado automático y los estilos visuales permiten que las aplicaciones de Windows Forms mantengan una apariencia coherente en comparación con las aplicaciones Windows nativas del equipo de cada usuario.

En su mayor parte, el escalado automático funciona según lo previsto en Windows Forms. Sin embargo, los cambios en la combinación de fuentes pueden causar problemas.

Importante

La documentación de la guía de escritorio para .NET 7 y .NET 6 está en proceso de elaboración.

Necesidad de escalado automático

Sin escalado automático, una aplicación diseñada para una fuente o una resolución de pantalla aparecerá demasiado pequeña o demasiado grande cuando se cambie la fuente o la resolución. Por ejemplo, si la aplicación está diseñada con Tahoma de 9 puntos como línea base, sin el ajuste aparecerá demasiado pequeña si se ejecuta en una máquina donde la fuente de sistema sea Tahoma de 12 puntos. Los elementos de texto, como títulos, menús, el contenido de cuadros de texto, etc. se representarán más pequeños que en otras aplicaciones. Además, el tamaño de los elementos de interfaz de usuario (UI) que contienen texto —como la barra de título, los menús y muchos controles— depende de la fuente usada. En este ejemplo, estos elementos también aparecerán relativamente más pequeños.

Una situación análoga se produce cuando se diseña una aplicación para una determinada resolución de pantalla. La resolución de pantalla más común es de 96 puntos por pulgada (PPP), lo que equivale a un escalado de la pantalla del 100 %, pero cada vez son más comunes las pantallas de mayor resolución que admiten 125 %, 150 %, 200 % (que equivalen, respectivamente, a 120, 144 y 192 PPP) y superiores. Si no se ajusta la escala de una aplicación diseñada para una resolución —especialmente si se trata de una aplicación basada en gráficos—, dicha aplicación se verá demasiado grande o demasiado pequeña cuando se ejecute a otra resolución.

El escalado automático busca solucionar estos problemas mediante el cambio automático del tamaño del formulario y de sus controles secundarios, en función del tamaño de fuente o la resolución de pantalla relativos. El sistema operativo Windows admite el escalado automático de cuadros de diálogo mediante una unidad relativa de medida denominada unidades de cuadro de diálogo. Una unidad de cuadro de diálogo se basa en la fuente del sistema y su relación con los píxeles se puede determinar mediante la función del SDK de Win32 GetDialogBaseUnits. Cuando un usuario cambia el tema usado por Windows, todos los cuadros de diálogo se ajustan automáticamente según corresponda. Además, Windows Forms admite el escalado automático en función de los valores predeterminados de fuente o resolución de pantalla del sistema. Opcionalmente, el escalado automático se puede deshabilitar en una aplicación.

Precaución

No se admiten combinaciones arbitrarias de los modos de escalado de DPI y fuente. Aunque puede escalar sin ningún problema un control de usuario usando un modo (por ejemplo, DPI) y colocarlo en un formulario usando otro modo (Font), la combinación de un formulario base en un modo y un formulario derivado en otro puede provocar resultados inesperados.

Escalado automático en acción

Windows Forms usa la lógica siguiente para escalar automáticamente los formularios y su contenido:

  1. En tiempo de diseño, cada ContainerControl registra el modo de escalado y su resolución actual en AutoScaleMode y AutoScaleDimensions, respectivamente.

  2. En tiempo de ejecución, la resolución real se almacena en la propiedad CurrentAutoScaleDimensions. La propiedad AutoScaleFactor calcula dinámicamente la proporción entre la resolución de escalado en tiempo de ejecución y tiempo de diseño.

  3. Si al cargar el formulario los valores de CurrentAutoScaleDimensions y AutoScaleDimensions son diferentes, se llamará al método PerformAutoScale para escalar el control y sus elementos secundarios. Este método suspende el diseño y llama al método Scale para realizar el escalado real. Después, el valor de AutoScaleDimensions se actualiza para evitar el escalado progresivo.

  4. PerformAutoScale también se invoca automáticamente en las situaciones siguientes:

    • En respuesta al evento OnFontChanged si el modo de escalado es Font.

    • Cuando el diseño del contenedor se reanuda y se detecta un cambio en las propiedades AutoScaleDimensions o AutoScaleMode.

    • Como se insinúa anteriormente, cuando se escala un elemento primario ContainerControl. Cada control contenedor es responsable de realizar el escalado de sus elementos secundarios mediante sus propios factores de escala, no los del contenedor primario.

  5. Los controles secundarios pueden modificar su comportamiento de escalado a través de varios medios:

    • La propiedad ScaleChildren se puede invalidar para determinar si se deben escalar sus controles secundarios o no.

    • El método GetScaledBounds se puede invalidar para ajustar los límites a los que se escala el control, pero no la lógica de escalado.

    • El método ScaleControl se puede invalidar para cambiar la lógica de escalado del control actual.

Vea también