Ajuste automático de escala en formularios Windows Forms

Actualización: noviembre 2007

El ajuste automático de escala permite que un formulario y sus controles, diseñados en un equipo con una resolución de pantalla o fuente de sistema determinada, se muestre correctamente en otro equipo con una resolución de pantalla o fuente de sistema distinta. Garantiza que el formulario y sus controles cambiarán el tamaño de forma inteligente para que sea coherente con aplicaciones Windows nativas y otras aplicaciones en los equipos de los usuarios y de otros desarrolladores. La compatibilidad que .NET Framework proporciona con el ajuste automático de escala y estilos visuales permite que las aplicaciones de .NET Framework mantengan una apariencia coherente en comparación con aplicaciones Windows nativas en cada equipo de usuario.

Necesidad de ajuste de escala automática

Sin el ajuste de escala automática, una aplicación diseñada para una resolución o fuente de pantalla aparecerá demasiado pequeña o demasiado grande cuando se cambie esa resolución o fuente. Por ejemplo, si la aplicación está diseñada con una fuente básica Tahoma de 9 puntos, sin el ajuste aparecerá demasiado pequeña si se ejecuta en un equipo donde la fuente de sistema sea Tahoma de 12 puntos. Los elementos de texto, como títulos, menús, contenido de cuadro de texto, etc. se representarán con menor tamaño que en otras aplicaciones. Además, el tamaño de los elementos de la interfaz de usuario (IU) que contienen texto, como la barra de título, los menús y muchos controles depende de la fuente utilizada. En este ejemplo, estos elementos también parecerán relativamente más pequeños.

Se produce una situación análoga 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), pero cada vez son más comunes las pantallas que admiten una resolución mayor de 120, 133, 170. Sin el ajuste, una aplicación, especialmente una gráfica, diseñada para una resolución aparecerá demasiado grande o pequeña cuando se ejecute en otra resolución.

El ajuste de escala automática busca mejorar estos problemas cambiando el tamaño del formulario y de sus controles secundarios de acuerdo al tamaño de fuente relativo o la resolución de pantalla. El sistema operativo Windows admite el ajuste de escala automática de cuadros de diálogo utilizando unidades de medida relativas llamadas 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 a través de la función GetDialogBaseUnits de Win32 SDK. Cuando un usuario cambia el tema utilizado por Windows, se ajustan automáticamente todos los cuadros de diálogo de modo correspondiente. Además,

.NET Framework admite el ajuste de escala automática según la fuente del sistema predeterminada o la resolución de pantalla. Opcionalmente, el ajuste de escala automática se puede deshabilitar en una aplicación.

Compatibilidad inicial de ajuste de escala automática

La versiones 1.0 y 1.1 de .NET Framework admitían el ajuste de escala automática de una manera sencilla que dependía de la fuente predeterminada de Windows utilizada para la interfaz de usuario, representada por el valor de DEFAULT_GUI_FONT de Win32 SDK. Se cambia esta fuente normalmente sólo cuando la resolución de pantalla cambia. Se ha utilizado el mecanismo siguiente para implementar la escala automática:

  1. En tiempo de diseño, se establecía la propiedad AutoScaleBaseSize (que ahora está en desuso) en el alto y ancho de la fuente del sistema predeterminada en el equipo del desarrollador.

  2. En tiempo de ejecución, se utilizaba la fuente del sistema predeterminada del equipo del usuario para inicializar la propiedad Font de la clase Form.

  3. Antes de mostrar el formulario, se llamaba al método ApplyAutoScaling para ajustar la escala del formulario. Este método calculaba los tamaños de la escala relativos de AutoScaleBaseSize y Font, se llamaba a continuación al método Scale para ajustar la escala real del formulario y sus elementos secundarios.

  4. Se actualizaba el valor de AutoScaleBaseSize para que las llamadas subsiguientes a ApplyAutoScaling no cambiaran progresivamente el tamaño del formulario.

Aunque este mecanismo era suficiente para la mayoría de los propósitos, sufría las limitaciones siguientes:

  • Dado que la propiedad AutoScaleBaseSize representa el tamaño de fuente básico como valores enteros, se producían errores de redondeo que eran evidentes cuando un formulario recorría varias resoluciones.

  • La escala automática se implementó sólo en la clase Form, no en la clase ContainerControl. Como consecuencia, sólo se ajustaba correctamente la escala de los controles de usuario cuando se había diseñado el control de usuario en la misma resolución que el formulario y se colocaba el formulario en tiempo de diseño.

  • Varios desarrolladores sólo podían diseñar concurrentemente formularios y sus controles secundarios si las resoluciones de sus equipos eran iguales. Igualmente, como consecuencia también la herencia de un formulario era dependiente de la resolución asociada al formulario principal.

  • No es compatible con los administradores de diseño más recientes introducidos con .NET Framework versión 2.0, como FlowLayoutPanel y TableLayoutPanel.

  • No se admitía el ajuste de escala basándose directamente en la resolución de pantalla necesaria para obtener compatibilidad con .NET Compact Framework.

Aunque este mecanismo se conserva en .NET Framework versión 2.0 para mantener la compatibilidad con versiones anteriores, se ha sustituido por el mecanismo de escala más compacto descrito a continuación. Como una consecuencia, AutoScale, ApplyAutoScaling, AutoScaleBaseSize y determinadas sobrecargas Scale están marcadas como obsoletas.

Nota:

Las referencias a estos miembros se pueden eliminar de manera segura cuando se actualiza el código heredado a la versión 2.0 de .NET Framework.

Compatibilidad actual de escala automática

.NET Framework versión 2.0 supera las limitaciones anteriores presentando los cambios siguientes en el ajuste de escala automática de formularios Windows Forms:

  • La compatibilidad básica para el ajuste de escala se ha desplazado a la clase ContainerControl, de modo que los formularios, los controles compuestos nativos y los controles de usuario reciben todos ellos compatibilidad con el ajuste de escala uniforme. Se han agregado los nuevos miembros: AutoScaleFactor, AutoScaleDimensions, AutoScaleMode y PerformAutoScale.

  • La clase Control también tiene varios miembros nuevos que permiten participar en el ajuste de escala y admitir el ajuste de escala combinada en el mismo formulario. Específicamente, los miembros: Scale, ScaleChildren y GetScaledBounds admiten el ajuste de escala.

  • Se ha agregado el ajuste de escala basándose en la resolución de pantalla para complementar la compatibilidad con la fuente del sistema, como se define en la enumeración AutoScaleMode. Este modo es compatible con el ajuste de escala automática admitido por .NET Compact Framework, que habilita una migración de aplicaciones más sencilla.

  • Se ha agregado la compatibilidad con administradores de diseño como FlowLayoutPanel y TableLayoutPanel a la implementación de la escala automática.

  • Los factores de escala ahora se representan como valores de punto flotante, utilizando normalmente la estructura SizeF, de modo que los errores de redondeo prácticamente se han eliminado.

Precaución:

No se admiten combinaciones arbitrarias de los modos de ajuste de escala DPI y Font. Aunque puede ajustar la escala de un control de usuario utilizando un modo (por ejemplo, DPI) y colocarlo en un formulario utilizando otro modo (Font) sin problemas, sin embargo, combinar un formulario base en un modo y un formulario derivado en otro puede llevar a resultados inesperados.

Ajuste de escala automática en acción

Los formularios Windows Forms ahora utilizan la lógica siguiente para ajustar la escala automática de formularios y su contenido:

  1. En tiempo de diseño, cada clase ContainerControl registra el modo de ajuste de escala y la resolución actual en las propiedades AutoScaleMode y AutoScaleDimensions, respectivamente.

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

  3. Cuando se carga el formulario, si los valores de CurrentAutoScaleDimensions y AutoScaleDimensions son distintos, se llama al método PerformAutoScale para ajustar la escala del control y sus elementos secundarios. Este método suspende el diseño y llama al método Scale para realizar el ajuste de escala real. Después, se actualiza el valor de AutoScaleDimensions para evitar el ajuste de escala progresiva.

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

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

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

    • Como se implica anteriormente, cuando se ajusta la escala de un ContainerControl primario. Cada control contenedor se encarga de ajustar la escala de sus elementos secundarios utilizando sus propios factores de escala y no el de su contenedor primario.

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

    • Se puede reemplazar la propiedad ScaleChildren para determinar si se debería ajustar la escala de sus controles secundarios o no.

    • Se puede reemplazar el método GetScaledBounds para ajustar los límites a los que se ajusta la escala del control, pero no la lógica de ajuste de escala.

    • Se puede reemplazar el método ScaleControl para cambiar la lógica de ajuste de escala del control actual.

Vea también

Tareas

Cómo: Habilitar estilos visuales en Windows XP

Cómo: Mejorar el rendimiento evitando el ajuste de tamaño automático

Conceptos

Representar controles con estilos visuales

Referencia

AutoScaleMode

Scale

PerformAutoScale

AutoScaleDimensions