Практическое руководство. Реагирование на изменения схемы шрифтов в приложениях Windows Forms
Обновлен: Ноябрь 2007
В операционных системах Windows пользователь может изменить параметры шрифтов на уровне системы, чтобы увеличить или уменьшить размер шрифта, отображаемого по умолчанию. Изменение этих параметров шрифтов особенно важно для пользователей с нарушениями зрения, которые нуждаются в большом размере шрифта при чтении текста с экрана. Приложение Windows Forms можно настроить так, чтобы при каждом изменении шрифтовой схемы, оно реагировало на эти изменения увеличением или уменьшением размера формы и всего содержащегося текста. Если требуется, чтобы форма приспосабливалась к изменениям размера шрифта динамически, то можно добавить в форму соответствующий код.
Как правило, формами Windows Forms используется шрифт по умолчанию, который возвращается при вызове метода GetStockObject(DEFAULT_GUI_FONT) пространства имен Microsoft.Win32. Шрифт, возвращаемый при вызове этого метода, изменяется только при изменении разрешения экрана. Как показано в следующей процедуре, ваш код должен изменить шрифт по умолчанию для IconTitleFont в ответ на изменение размера шрифта.
Чтобы использовать шрифт рабочего стола и реагировать на изменения шрифтовой схемы, выполните следующие действия.
Создайте форму и добавьте в нее требуемые элементы управления. Дополнительные сведения см. в разделах Практическое руководство. Создание приложение Windows Forms из командной строки и Элементы управления для использования в формах Windows Forms.
Добавьте в код ссылку на пространство имен Microsoft.Win32.
Imports Microsoft.Win32
using Microsoft.Win32;
Добавьте следующий код в конструктор формы для подключения необходимых обработчиков событий и изменения шрифта по умолчанию для данной формы.
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);
Реализуйте обработчик события UserPreferenceChanged, который приводит к автоматическому масштабированию формы при изменении категории Window.
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; } }
Наконец, реализуйте обработчик события FormClosing, который отсоединяет обработчик событий 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
void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
SystemEvents.UserPreferenceChanged -= new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
}
Чтобы вручную изменить шрифтовую схему в Windows XP, выполните следующие действия.
Во время работы приложения Windows Forms щелкните правой кнопкой мыши рабочий стол Windows и выберите Свойства в контекстном меню.
В диалоговом окне Свойства: Экран перейдите на вкладку Вид.
Из раскрывающегося списка Размер шрифта выберите новый размер шрифта.
Обратите внимание, что форма теперь реагирует на изменения схемы шрифтов рабочего стола во время выполнения. Когда пользователь переключается между значениями Обычный, Крупный шрифт и Огромный шрифт, форма изменяет шрифт и корректно масштабируется.
Пример
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);
}
}
}
Конструктор в этом примере кода содержит вызов метода InitializeComponent, который определен при создании нового проекта Windows Forms в Visual Studio. Удалите эту строку кода при построении приложения из командной строки.
См. также
Основные понятия
Автоматическое масштабирование в Windows Forms