Procedimiento para responder a los cambios de las combinaciones de fuentes en una aplicación de formularios Windows Forms

En los sistemas operativos Windows, un usuario puede cambiar la configuración de la fuente en todo el sistema para hacer que la fuente predeterminada aparezca más grande o más pequeña. Cambiar la configuración de estas fuentes es fundamental para los usuarios con problemas de visión que necesitan un tipo de letra más grande para leer el texto en sus pantallas. Puede ajustar su aplicación Windows Forms para que reaccione a estos cambios aumentando o disminuyendo el tamaño del formulario y de todo el texto contenido siempre que cambie la combinación de fuentes. Si desea que el formulario se adapte dinámicamente a los cambios en los tamaños de fuente, puede agregar código al formulario.

Normalmente, la fuente predeterminada usada por Windows Forms es la fuente devuelta por la llamada del espacio de nombres Microsoft.Win32 a GetStockObject(DEFAULT_GUI_FONT). La fuente devuelta por esta llamada solo cambia cuando cambia la resolución de pantalla. Como se muestra en el siguiente procedimiento, su código debe cambiar la fuente predeterminada a IconTitleFont para responder a los cambios en el tamaño de la fuente.

Para usar la fuente de escritorio y responder a los cambios de combinación de fuentes

  1. Cree el formulario y agregue los controles que desee. Para obtener más información, vea Cómo: Crear una aplicación de Windows Forms desde la línea de comandos y Controles a utilizar en Windows Forms.

  2. Agregue una referencia al espacio de nombres Microsoft.Win32 a su código.

    using Microsoft.Win32;
    
    Imports Microsoft.Win32
    
  3. Agregue el código siguiente al constructor del formulario para enlazar controladores de eventos necesarios y cambiar la fuente predeterminada en uso para el formulario.

    this.Font = SystemFonts.IconTitleFont;
    SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
    this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
    
    Public Sub New()
        ' This call is required by the Windows Form Designer.
        InitializeComponent()
    
        ' Add any initialization after the InitializeComponent() call.
        AddHandler SystemEvents.UserPreferenceChanged, New UserPreferenceChangedEventHandler(AddressOf SystemEvents_UserPreferenceChangesEventHandler)
    End Sub
    
  4. Implemente un controlador para el evento UserPreferenceChanged que hace que el formulario se escale automáticamente cuando la categoría Window cambia.

    void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
    {
        if (e.Category == UserPreferenceCategory.Window)
        {
            this.Font = SystemFonts.IconTitleFont;
        }
    }
    
    Private Sub SystemEvents_UserPreferenceChangesEventHandler(ByVal sender As Object, ByVal e As UserPreferenceChangedEventArgs)
        If (e.Category = UserPreferenceCategory.Window) Then
            Me.Font = SystemFonts.IconTitleFont
        End If
    End Sub
    
  5. Por último, implemente un controlador para el evento FormClosing que separa el controlador del evento UserPreferenceChanged.

    Importante

    Si no se incluye este código, la aplicación perderá memoria.

    void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        SystemEvents.UserPreferenceChanged -= new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
    }
    
    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        RemoveHandler SystemEvents.UserPreferenceChanged, New UserPreferenceChangedEventHandler(AddressOf SystemEvents_UserPreferenceChangesEventHandler)
    End Sub
    
  6. Compile y ejecute el código.

Para cambiar manualmente la combinación de fuentes en Windows XP

  1. Mientras se ejecuta su aplicación Windows Forms, haga clic con el botón derecho en el escritorio de Windows y seleccione Propiedades en el menú contextual.

  2. En el cuadro de diálogo Propiedades de pantalla, haga clic en la pestaña Apariencia.

  3. En el cuadro de lista desplegable Tamaño de fuente, seleccione un nuevo tamaño de fuente.

    Observará que el formulario ahora reacciona a los cambios en tiempo de ejecución en la combinación de fuentes de escritorio. Cuando el usuario cambia entre Normal, Fuentes grandes, y Fuentes extra grandes, el formulario cambia de fuente y se escala correctamente.

Ejemplo

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32;

namespace WinFormsAutoScaling
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            this.Font = SystemFonts.IconTitleFont;
            SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
            this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
        }

        void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
        {
            if (e.Category == UserPreferenceCategory.Window)
            {
                this.Font = SystemFonts.IconTitleFont;
            }
        }

        void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            SystemEvents.UserPreferenceChanged -= new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
        }
    }
}
Imports Microsoft.Win32

Public Class Form1
    Public Sub New()
        ' This call is required by the Windows Form Designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        AddHandler SystemEvents.UserPreferenceChanged, New UserPreferenceChangedEventHandler(AddressOf SystemEvents_UserPreferenceChangesEventHandler)
    End Sub

    Private Sub SystemEvents_UserPreferenceChangesEventHandler(ByVal sender As Object, ByVal e As UserPreferenceChangedEventArgs)
        If (e.Category = UserPreferenceCategory.Window) Then
            Me.Font = SystemFonts.IconTitleFont
        End If
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        RemoveHandler SystemEvents.UserPreferenceChanged, New UserPreferenceChangedEventHandler(AddressOf SystemEvents_UserPreferenceChangesEventHandler)
    End Sub
End Class

El constructor de este ejemplo de código contiene una llamada a InitializeComponent, que se define al crear un nuevo proyecto de Windows Forms en Visual Studio. Elimine esta línea de código si está construyendo su aplicación en la línea de comandos.

Vea también