Escalado automático en Windows FormsAutomatic scaling in Windows Forms

El escalado automático permite que un formulario y sus respectivos controles, diseñados en una máquina con una determinada resolución de pantalla o fuente del sistema, se muestren correctamente en otra máquina con una resolución de pantalla o una fuente de sistema diferentes.Automatic scaling enables a form and its controls, designed on one machine with a certain display resolution or system font, to be displayed appropriately on another machine with a different display resolution or system font. 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.It assures that the form and its controls will intelligently resize to be consistent with native windows and other applications on both the users' and other developers' machines. La compatibilidad del .NET Framework para el escalado automático y los estilos visuales permite que las aplicaciones .NET Framework mantengan una apariencia coherente en comparación con aplicaciones Windows nativas en el equipo de cada usuario.The support of the .NET Framework for automatic scaling and visual styles enables .NET Framework applications to maintain a consistent look and feel when compared to native Windows applications on each user's machine.

En su mayor parte, el escalado automático funciona según lo previsto en .NET Framework versión 2,0 y posteriores.For the most part, automatic scaling works as expected in .NET Framework version 2.0 and later. Sin embargo, los cambios en la combinación de fuentes pueden causar problemas.However, font scheme changes can be problematic. Para obtener un ejemplo de cómo resolver este error, consulte Cómo: responder a los cambios de la combinación de fuentes en una aplicación Windows Forms.For an example of how to resolve this, see How to: Respond to Font Scheme Changes in a Windows Forms Application.

Necesidad de escalado automáticoNeed for automatic scaling

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.Without automatic scaling, an application designed for one display resolution or font will either appear too small or too large when that resolution or font is changed. 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.For example, if the application is designed using Tahoma 9 point as a baseline, without adjustment it will appear too small if run on a machine where the system font is Tahoma 12 point. 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.Text elements, such as titles, menus, text box contents, and so on will render smaller than other applications. 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.Furthermore, the size of user interface (UI) elements that contain text, such as the title bar, menus, and many controls are dependent on the font used. En este ejemplo, estos elementos también aparecerán relativamente más pequeños.In this example, these elements will also appear relatively smaller.

Una situación análoga se produce cuando se diseña una aplicación para una determinada resolución de pantalla.An analogous situation occurs when an application is designed for a certain display resolution. La resolución de pantalla más común es de 96 puntos por pulgada (PPP), que es igual a la escala de visualización 100%, pero la resolución más alta muestra la compatibilidad con 125%, 150%, 200% (que respectivamente son iguales a 120, 144 y 192 PPP) y versiones posteriores son más comunes.The most common display resolution is 96 dots per inch (DPI), which equals 100% display scaling, but higher resolution displays supporting 125%, 150%, 200% (which respectively equal 120, 144 and 192 DPI) and above are becoming more common. 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.Without adjustment, an application, especially a graphics-based one, designed for one resolution will appear either too large or too small when run at another resolution.

El escalado automático busca mejorar estos problemas con un cambio automático el tamaño del formulario y de sus controles secundarios, de acuerdo con el tamaño de fuente o la resolución de pantalla relativos.Automatic scaling seeks to ameliorate these problems by automatically resizing the form and its child controls according to the relative font size or display resolution. 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.The Windows operating system supports automatic scaling of dialog boxes using a relative unit of measurement called dialog units. 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.A dialog unit is based on the system font and its relationship to pixels can be determined though the Win32 SDK function GetDialogBaseUnits. Cuando un usuario cambia el tema usado por Windows, todos los cuadros de diálogo se ajustan automáticamente según corresponda.When a user changes the theme used by Windows, all dialog boxes are automatically adjusted accordingly. Además, el .NET Framework admite el escalado automático según la fuente predeterminada del sistema o la resolución de pantalla.In addition, the .NET Framework supports automatic scaling either according to the default system font or the display resolution. Opcionalmente, el escalado automático se puede deshabilitar en una aplicación.Optionally, automatic scaling can be disabled in an application.

Compatibilidad original con el escalado automáticoOriginal support for automatic scaling

Las versiones 1,0 y 1,1 del .NET Framework admiten el escalado automático de una manera sencilla que dependía de la fuente predeterminada de Windows usada para la interfaz de usuario, representada por el valor del SDK de Win32 DEFAULT_GUI_FONT.Versions 1.0 and 1.1 of the .NET Framework supported automatic scaling in a straightforward manner that was dependent on the Windows default font used for the UI, represented by the Win32 SDK value DEFAULT_GUI_FONT. Por lo general, esta fuente solo se cambia cuando se modifica la resolución de pantalla.This font is typically only changed when the display resolution changes. El mecanismo siguiente se usó para implementar el escalado automático:The following mechanism was used to implement automatic scaling:

  1. En tiempo de diseño, la propiedad AutoScaleBaseSize (que ahora está en desuso) se estableció en el alto y ancho de la fuente predeterminada del sistema en la máquina del desarrollador.At design time, the AutoScaleBaseSize property (which is now deprecated) was set to the height and width of the default system font on the developer's machine.

  2. En runtime, la fuente predeterminada del sistema de la máquina del usuario se usaba para inicializar la propiedad Font de la clase Form.At runtime, the default system font of the user's machine was used to initialize the Font property of the Form class.

  3. Antes de mostrar el formulario, se llamaba al método ApplyAutoScaling para escalar el formulario.Before displaying the form, the ApplyAutoScaling method was called to scale the form. Este método calculaba los tamaños de escala relativa de AutoScaleBaseSize y Font y, a continuación, se llamaba al método Scale para escalar el formulario y sus elementos secundarios.This method calculated the relative scale sizes from AutoScaleBaseSize and Font then called the Scale method to actually scale the form and its children.

  4. El valor de AutoScaleBaseSize se actualizaba para que las siguientes llamadas a ApplyAutoScaling no cambiaran progresivamente el tamaño del formulario.The value of AutoScaleBaseSize was updated so that subsequent calls to ApplyAutoScaling did not progressively resize the form.

Aunque este mecanismo era suficiente para la mayoría de los propósitos, sufría las limitaciones siguientes:While this mechanism was sufficient for most purposes, it suffered from the following limitations:

  • Dado que la AutoScaleBaseSize propiedad representa el tamaño de fuente de línea base como valores enteros, se producen errores de redondeo que se vuelven evidentes cuando un formulario se recorre en varias resoluciones.Since the AutoScaleBaseSize property represents the baseline font size as integer values, rounding errors occur that become evident when a form is cycled through multiple resolutions.

  • El escalado automático se implementó solo en la clase Form, no en la clase ContainerControl.Automatic scaling was implemented in only the Form class, not in the ContainerControl class. Como resultado, los controles de usuario solo se escalaban correctamente si el control de usuario estaba diseñado con la misma resolución que el formulario y se colocaba en el formulario en tiempo de diseño.As a result, user controls would scale correctly only when the user control was designed at the same resolution as the form, and it was placed in the form at design time.

  • Los formularios y sus controles secundarios solo podían diseñarse de manera simultánea por varios desarrolladores si las resoluciones de sus máquinas eran iguales.Forms and their child controls could only be concurrently designed by multiple developers if their machine resolutions were the same. Igualmente, hacía que la herencia de un formulario dependiese de la resolución asociada con el formulario principal.Likewise it also made inheritance of a form dependent on the resolution associated with the parent form.

  • No es compatible con los administradores de diseño más recientes que se introdujeron con la versión .NET Framework 2,0, como FlowLayoutPanel y TableLayoutPanel .It is not compatible with the newer layout managers introduced with the .NET Framework version 2.0, such as FlowLayoutPanel and TableLayoutPanel.

  • No admitía el escalado basado directamente en la resolución de pantalla necesaria para la compatibilidad con el .NET Compact Framework.It did not support scaling based directly on the display resolution that is required for compatibility to the .NET Compact Framework.

Aunque este mecanismo se conserva en la .NET Framework versión 2,0 para mantener la compatibilidad con versiones anteriores, se ha sustituido por el mecanismo de escalado más sólido que se describe a continuación.Although this mechanism is preserved in the .NET Framework version 2.0 to maintain backward compatibility, it has been superseded by the more robust scaling mechanism described next. En consecuencia, AutoScale, ApplyAutoScaling, AutoScaleBaseSize y determinadas sobrecargas Scale están marcadas como obsoletas.As a consequence, the AutoScale, ApplyAutoScaling, AutoScaleBaseSize, and certain Scale overloads are marked as obsolete.

Nota

Puede eliminar de forma segura las referencias a estos miembros cuando actualice el código heredado a la .NET Framework versión 2,0.You can safely delete references to these members when you upgrade your legacy code to the .NET Framework version 2.0.

Compatibilidad actual con el escalado automáticoCurrent support for automatic scaling

La .NET Framework versión 2,0 supera las limitaciones anteriores introduciendo los cambios siguientes en el escalado automático de Windows Forms:The .NET Framework version 2.0 surmounts previous limitations by introducing the following changes to the automatic scaling of Windows Forms:

  • El soporte básico para el escalado se ha movido a la clase ContainerControl para que los formularios, los controles compuestos nativos y los controles de usuario reciban soporte de escalado uniforme.Base support for scaling has been moved to the ContainerControl class so that forms, native composite controls and user controls all receive uniform scaling support. Se han agregado los nuevos miembros AutoScaleFactor, AutoScaleDimensions, AutoScaleMode y PerformAutoScale.The new members AutoScaleFactor, AutoScaleDimensions, AutoScaleMode and PerformAutoScale have been added.

  • La clase Control también tiene varios miembros nuevos que le permiten participar en el escalado y admitir escalado mixto en el mismo formulario.The Control class also has several new members that allow it to participate in scaling and to support mixed scaling on the same form. Concretamente, los miembros Scale, ScaleChildren y GetScaledBounds admiten el escalado.Specifically the Scale, ScaleChildren, and GetScaledBounds members support scaling.

  • Se ha agregado soporte de escalado basado en la resolución de pantalla para complementar el soporte de fuentes del sistema, tal como se define en la enumeración AutoScaleMode.Support for scaling based upon the screen resolution has been added to complement system font support, as defined by the AutoScaleMode enumeration. Este modo es compatible con el escalado automático admitido por el .NET Compact Framework habilitando la migración de aplicaciones más sencilla.This mode is compatible with automatic scaling supported by the .NET Compact Framework enabling easier application migration.

  • Se ha agregado compatibilidad con administradores de diseño como FlowLayoutPanel y TableLayoutPanel a la implementación del escalado automático.Compatibility with layout managers such as FlowLayoutPanel and TableLayoutPanel has been added to the implementation of automatic scaling.

  • Los factores de escalado se representan ahora como valores de número de punto flotante, normalmente mediante la estructura SizeF, con lo que prácticamente se han eliminado los errores de redondeo.Scaling factors are now represented as floating point values, typically using the SizeF structure, so that rounding errors have been practically eliminated.

Precaución

No se admiten combinaciones arbitrarias de los modos de escalado de DPI y fuente.Arbitrary mixtures of DPI and font scaling modes are not supported. 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.Although you may scale a user control using one mode (for example, DPI) and place it on a form using another mode (Font) with no issues, but mixing a base form in one mode and a derived form in another can lead to unexpected results.

Escalado automático en acciónAutomatic scaling in action

Windows Forms ahora usa la lógica siguiente para escalar automáticamente los formularios y su contenido:Windows Forms now uses the following logic to automatically scale forms and their contents:

  1. En tiempo de diseño, cada ContainerControl registra el modo de escalado y su resolución actual en AutoScaleMode y AutoScaleDimensions, respectivamente.At design time, each ContainerControl records the scaling mode and it current resolution in the AutoScaleMode and AutoScaleDimensions, respectively.

  2. En tiempo de ejecución, la resolución real se almacena en la propiedad CurrentAutoScaleDimensions.At run time, the actual resolution is stored in the CurrentAutoScaleDimensions property. 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.The AutoScaleFactor property dynamically calculates the ratio between the run-time and design-time scaling resolution.

  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.When the form loads, if the values of CurrentAutoScaleDimensions and AutoScaleDimensions are different, then the PerformAutoScale method is called to scale the control and its children. Este método suspende el diseño y llama al método Scale para realizar el escalado real.This method suspends layout and calls the Scale method to perform the actual scaling. Después, el valor de AutoScaleDimensions se actualiza para evitar el escalado progresivo.Afterwards, the value of AutoScaleDimensions is updated to avoid progressive scaling.

  4. PerformAutoScale también se invoca automáticamente en las situaciones siguientes:PerformAutoScale is also automatically invoked in the following situations:

    • En respuesta al evento OnFontChanged si el modo de escalado es Font.In response to the OnFontChanged event if the scaling mode is Font.

    • Cuando el diseño del contenedor se reanuda y se detecta un cambio en las propiedades AutoScaleDimensions o AutoScaleMode.When the layout of the container control resumes and a change is detected in the AutoScaleDimensions or AutoScaleMode properties.

    • Como se insinúa anteriormente, cuando se escala un elemento primario ContainerControl.As implied above, when a parent ContainerControl is being scaled. Cada control contenedor es responsable de realizar el escalado de sus elementos secundarios mediante sus propios factores de escala, no los del contenedor primario.Each container control is responsible for scaling its children using its own scaling factors and not the one from its parent container.

  5. Los controles secundarios pueden modificar su comportamiento de escalado a través de varios medios:Child controls can modify their scaling behavior through several means:

    • La propiedad ScaleChildren se puede invalidar para determinar si se deben escalar sus controles secundarios o no.The ScaleChildren property can be overridden to determine if their child controls should be scaled or not.

    • 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.The GetScaledBounds method can be overridden to adjust the bounds that the control is scaled to, but not the scaling logic.

    • El método ScaleControl se puede invalidar para cambiar la lógica de escalado del control actual.The ScaleControl method can be overridden to change the scaling logic for the current control.

Consulte tambiénSee also