Filtrar Responder a los cambios de esquema de fuentes en una aplicación de Windows FormsHow to: Respond to Font Scheme Changes in a Windows Forms Application

En los sistemas operativos Windows, un usuario puede cambiar la configuración de fuente de todo el sistema para que la fuente predeterminada aparezca mayor o menor.In the Windows operating systems, a user can change the system-wide font settings to make the default font appear larger or smaller. Cambiar esta configuración de fuente es fundamental para los usuarios que son personas con discapacidad visual y requieren un tipo mayor leer el texto en sus pantallas.Changing these font settings is critical for users who are visually impaired and require larger type to read the text on their screens. Puede ajustar la aplicación de Windows Forms para reaccionar a estos cambios aumentando o reduciendo el tamaño del formulario y todo el texto cada vez que cambia el esquema de la fuente.You can adjust your Windows Forms application to react to these changes by increasing or decreasing the size of the form and all contained text whenever the font scheme changes. Si desea que el formulario para adaptarse dinámicamente a cambios en los tamaños de fuente, puede agregar código al formulario.If you want your form to accommodate changes in font sizes dynamically, you can add code to your form.

Normalmente, la fuente predeterminada utilizada por Windows Forms es la fuente devuelta por la Microsoft.Win32 llamada del espacio de nombres a GetStockObject(DEFAULT_GUI_FONT).Typically, the default font used by Windows Forms is the font returned by the Microsoft.Win32 namespace call to GetStockObject(DEFAULT_GUI_FONT). La fuente devuelta por esta llamada sólo cambia cuando la resolución de pantalla.The font returned by this call only changes when the screen resolution changes. Como se muestra en el siguiente procedimiento, el código debe cambiar la fuente predeterminada para IconTitleFont para responder a cambios en el tamaño de fuente.As shown in the following procedure, your code must change the default font to IconTitleFont to respond to changes in font size.

Para usar la fuente del escritorio y responder a los cambios de esquema de fuenteTo use the desktop font and respond to font scheme changes

  1. Cree el formulario y agregue los controles que desee a él.Create your form, and add the controls you want to it. Para obtener más información, vea Cómo: Crear una aplicación de Windows Forms desde la línea de comandos y controles que se utilizan en Windows Forms.For more information, see How to: Create a Windows Forms Application from the Command Line and Controls to Use on Windows Forms.

  2. Agregue una referencia a la Microsoft.Win32 espacio de nombres en el código.Add a reference to the Microsoft.Win32 namespace to your code.

    using Microsoft.Win32;
    
    Imports Microsoft.Win32
    
  3. Agregue el código siguiente al constructor del formulario para enlazar controladores de eventos necesarios así como cambiar la fuente predeterminada utilizada para el formulario.Add the following code to the constructor of your form to hook up required event handlers, and to change the default font in use for the form.

    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. Implementar un controlador para el UserPreferenceChanged eventos que hace que el formulario escalar automáticamente cuando el Window cambios de categoría.Implement a handler for the UserPreferenceChanged event that causes the form to scale automatically when the Window category changes.

    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 FormClosing eventos que separa el UserPreferenceChanged controlador de eventos.Finally, implement a handler for the FormClosing event that detaches the UserPreferenceChanged event handler.

    Importante

    Error al incluir este código hará que la aplicación a una pérdida de memoria.Failure to include this code will cause your application to leak memory.

    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.Compile and run the code.

Para cambiar manualmente la combinación de fuentes en Windows XPTo manually change the font scheme in Windows XP

  1. Mientras se ejecuta la aplicación de Windows Forms, haga clic en el escritorio de Windows y elija propiedades en el menú contextual.While your Windows Forms application is running, right-click the Windows desktop and choose Properties from the shortcut menu.

  2. En el las propiedades de presentación cuadro de diálogo, haga clic en el apariencia ficha.In the Display Properties dialog box, click the Appearance tab.

  3. Desde el Font Size lista desplegable, seleccione un nuevo tamaño de fuente.From the Font Size drop-down list box, select a new font size.

    Observará que ahora el formulario responde a los cambios de tiempo de ejecución en el esquema de la fuente del escritorio.You'll notice that the form now reacts to run-time changes in the desktop font scheme. Cuando el usuario cambia entre Normal, fuentes grandes, y fuentes muy grandes, el formulario cambia la fuente y se escala correctamente.When the user changes between Normal, Large Fonts, and Extra Large Fonts, the form changes font and scales correctly.

EjemploExample

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.The constructer in this code example contains a call to InitializeComponent, which is defined when you create a new Windows Forms project in Visual Studio. Si va a compilar la aplicación en la línea de comandos, quite esta línea de código.Remove this line of code if you are building your application on the command line.

Vea tambiénSee also