Поделиться через


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

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

Как правило, шрифт по умолчанию, используемый Windows Forms, — это шрифт, возвращаемый вызовом пространства имен Microsoft.Win32 для GetStockObject(DEFAULT_GUI_FONT). Шрифт, возвращаемый этим вызовом, изменяется только при изменении разрешения экрана. Как показано в следующей процедуре, код должен изменить шрифт по умолчанию на 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. Удалите эту строку кода, если вы создаете приложение в командной строке.

См. также