Como: Responder às mudanças de esquema de fonte em um aplicativo do Windows Forms
Nos sistemas operacionais do Windows, um usuário pode alterar as configurações de fonte de todo o sistema para tornar a fonte padrão maior ou menor. Alterar essas configurações de fonte é fundamental para os usuários que possuem deficiência visual e exigem letras maiores para ler o texto em suas telas. Você pode ajustar seu aplicativo de Formulários do Windows para reagir a essas alterações aumentando ou diminuindo o tamanho do formulário e todo o texto contido nele sempre que o esquema de fontes for alterado. Se você desejar a forma acomodar alterações de tamanhos de fonte dinamicamente, você pode adicionar código ao seu formulário.
Normalmente, a fonte padrão usada pelo Formulários do Windows é a fonte retornada pela chamada GetStockObject(DEFAULT_GUI_FONT) à namespace Microsoft.Win32. A fonte retornada por essa chamada muda somente quando a resolução da tela muda. Conforme mostrado no procedimento o seguir, o código deve alterar a fonte padrão para IconTitleFont para responder às alterações em tamanho da fonte.
Para usar a fonte da área de trabalho e responder às alterações do esquema de fonte.
Crie seu formulário e adicione os controles desejados a ele. Para obter mais informações, consulte Como: Criar um aplicativo de formulários do Windows a partir da linha de comando e Controles para uso no Windows Forms.
Adicione uma referência para o namespace Microsoft.Win32 ao seu código.
Imports Microsoft.Win32
using Microsoft.Win32;
Adicione o código seguinte ao construtor de seu formulário para ligar os manipuladores de evento necessários e alterar a fonte padrão em uso no formulário.
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
this.Font = SystemFonts.IconTitleFont; SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged); this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
Implemente um manipulador para o evento UserPreferenceChanged que faz com que o formulário se redimensione automaticamente quando a categoria Window muda.
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
void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e) { if (e.Category == UserPreferenceCategory.Window) { this.Font = SystemFonts.IconTitleFont; } }
Finalmente, implemente um manipulador para o evento FormClosing que dispara o manipulador de eventos UserPreferenceChanged.
Importante |
---|
Uma falha ao adicionar este código fará com que seu aplicativo ultrapasse memória. |
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
void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
SystemEvents.UserPreferenceChanged -= new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
}
- Compilar e executar o código.
Para alterar manualmente o esquema de fontes no Windows XP.
Enquanto seu aplicativo de Formulários do Windows está sendo executado, clique com o botão direito do mouse na área de trabalho do Windows e escolha Propriedades no menu popup
Na caixa de diálogo Propriedades de Vídeo , clique na guia Aparência.
Da lista suspensa Tamanho da Fonte , selecione um novo tamanho da fonte.
Você observará que o formulário agora reage a alterações no esquema de fontes da área de trabalho em tempo de execução. Quando o usuário altera entre Normal , Fontes Grandes e Fontes Extragrandes , o formulário muda a fonte e redimensiona corretamente.
Exemplo
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
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);
}
}
}
O construtor neste código exemplo contém uma chamada para InitializeComponent, que é definida quando você cria um novo projeto de Formulários do Windows no Visual Studio. Remova esta linha de código se você estiver criando seu aplicativo na linha de comando.