Compartilhar via


Como responder a alterações de esquema de fontes em um aplicativo do Windows Forms

Nos sistemas operacionais Windows, um usuário pode alterar as configurações de fonte em todo o sistema para fazer com que a fonte padrão pareça maior ou menor. A alteração dessas configurações de fonte é fundamental para os usuários com deficiência visual e exigem um tipo maior para ler o texto em suas telas. Você pode ajustar seu aplicativo do Windows Forms para reagir a essas alterações aumentando ou diminuindo o tamanho do formulário e todo o texto contido sempre que o esquema de fontes for alterado. Se você quiser que seu formulário acomode as alterações em tamanhos de fonte dinamicamente, você pode adicionar código ao seu formulário.

Normalmente, a fonte padrão usada pelos Windows Forms é a fonte retornada pela chamada do namespace Microsoft.Win32 para GetStockObject(DEFAULT_GUI_FONT). A fonte retornada por essa chamada só é alterada quando a resolução da tela é alterada. Conforme mostrado no procedimento a seguir, seu código deve alterar a fonte padrão para IconTitleFont para responder a alterações no tamanho da fonte.

Para usar a fonte da área de trabalho e responder às alterações do esquema de fontes

  1. Crie seu formulário e adicione os controles que você deseja. Para obter mais informações, consulte Como criar um aplicativo do Windows Forms a partir da linha de comando e Controles para usar no Windows Forms.

  2. Adicione uma referência ao namespace Microsoft.Win32 ao seu código.

    using Microsoft.Win32;
    
    Imports Microsoft.Win32
    
  3. Adicione o código a seguir ao construtor do formulário para conectar os manipuladores de eventos necessários e alterar a fonte padrão em uso para o formulário.

    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 um manipulador para o evento UserPreferenceChanged que faz com que o formulário seja dimensionado automaticamente quando a categoria Window for alterada.

    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 fim, implemente um manipulador para o evento FormClosing que desanexe o manipulador de eventos UserPreferenceChanged.

    Importante

    A falha ao incluir esse código fará com que seu aplicativo vaze memória.

    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 e execute o código.

Para alterar manualmente o esquema de fontes no Windows XP

  1. Enquanto o aplicativo Windows Forms está em execução, clique com o botão direito do mouse na área de trabalho do Windows e escolha Propriedades no menu de atalho.

  2. Na caixa de diálogo Propriedades de Exibição, clique na guia Aparência.

  3. Na caixa de listagem suspensa Tamanho da Fonte, selecione um novo tamanho de fonte.

    Você observará que o formulário agora reage às alterações em tempo de execução no esquema de fontes da área de trabalho. Quando o usuário muda em Normal, Fontes Grandese Fontes Extra Grandes, o formulário altera a fonte e é dimensionado corretamente.

Exemplo

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

O construtor neste exemplo de código contém uma chamada para InitializeComponent, que é definida quando você cria um novo projeto do Windows Forms no Visual Studio. Remova essa linha de código se você estiver criando seu aplicativo na linha de comando.

Consulte também