Практическое руководство. Реагирование на изменения схемы шрифтов в приложениях Windows Forms

В операционных системах Windows пользователь может изменить параметры шрифта на уровне системы, чтобы увеличить или уменьшить шрифт по умолчанию. Изменение этих параметров шрифта крайне важно для пользователей с нарушением зрения, которым для чтения текста на экране требуется более крупный тип. Вы можете настроить приложение Windows Forms таким образом, чтобы оно реагировало на эти изменения путем увеличения или уменьшения размера формы и всего содержащегося в нем текста при каждом изменении схемы шрифтов. Если вы хотите, чтобы форма динамически учитывала изменения в размерах шрифтов, можно добавить код в форму.

Как правило, шрифт по умолчанию, используемый Windows Forms, является шрифтом, возвращаемым вызовом GetStockObject(DEFAULT_GUI_FONT), который осуществляет пространство имен Microsoft.Win32. Шрифт, возвращаемый этим вызовом, изменяется только при изменении разрешения экрана. Как показано в следующей процедуре, чтобы среагировать на изменения в размере шрифта, код должен изменить шрифт по умолчанию на IconTitleFont.

Использование шрифта рабочего стола и реагирование на изменения схемы шрифтов

  1. Создайте форму и добавьте в нее необходимые элементы управления. Дополнительные сведения см. в разделах Практическое руководство. Создание приложения Windows Forms из командной строки и Элементы управления для использования в Windows Forms.

  2. Добавьте в код ссылку на пространство имен Microsoft.Win32.

    using Microsoft.Win32;
    
    Imports Microsoft.Win32
    
  3. Добавьте следующий код в конструктор формы, чтобы подключить необходимые обработчики событий и изменить шрифт по умолчанию, используемый для формы.

    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. Реализуйте обработчик для события UserPreferenceChanged, которое приводит к автоматическому масштабированию формы при изменении категории Window.

    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. Наконец, реализуйте обработчик для события FormClosing, которое окончательно удаляет обработчик событий UserPreferenceChanged.

    Важно!

    Если не включить этот код, это приведет к утечке памяти приложения.

    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. Скомпилируйте и запустите код.

Изменение схемы шрифтов в Windows XP вручную

  1. Пока работает приложение Windows Forms, щелкните правой кнопкой мыши на рабочем столе Windows и выберите пункт Свойства в контекстном меню.

  2. В диалоговом окне Свойства экрана перейдите на вкладку Внешний вид.

  3. В раскрывающемся списке Размер шрифта выберите новый размер шрифта.

    Вы заметите, что теперь форма реагирует на изменения в схеме шрифтов рабочего стола во время выполнения. Когда пользователь выбирает обычные, крупные и очень крупные шрифты, форма изменяет шрифт и масштабируется надлежащим образом.

Пример

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

Конструктор в этом примере кода содержит вызовInitializeComponent, который определяется при создании нового проекта Windows Forms в Visual Studio. Удалите эту строку кода, если вы создаете приложение в командной строке.

См. также