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 de Microsoft.Win32 namespace 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 responder às 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 com base na linha de comando e controles a serem usados nos Windows Forms.

  2. Adicione uma referência ao Microsoft.Win32 namespace 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 do 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 FormClosing evento que desanexe o UserPreferenceChanged manipulador de eventos.

    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 seu aplicativo do 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 entre Fontes Normais, Grandes e Fontes Grandes Extras, 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