Практическое руководство. Реагирование на изменения схемы шрифтов в приложениях Windows Forms
В операционных системах Windows пользователь может изменить параметры шрифта на уровне системы, чтобы увеличить или уменьшить шрифт по умолчанию. Изменение этих параметров шрифта крайне важно для пользователей с нарушением зрения, которым для чтения текста на экране требуется более крупный тип. Вы можете настроить приложение Windows Forms таким образом, чтобы оно реагировало на эти изменения путем увеличения или уменьшения размера формы и всего содержащегося в нем текста при каждом изменении схемы шрифтов. Если вы хотите, чтобы форма динамически учитывала изменения в размерах шрифтов, можно добавить код в форму.
Как правило, шрифт по умолчанию, используемый Windows Forms, является шрифтом, возвращаемым вызовом GetStockObject(DEFAULT_GUI_FONT)
, который осуществляет пространство имен Microsoft.Win32. Шрифт, возвращаемый этим вызовом, изменяется только при изменении разрешения экрана. Как показано в следующей процедуре, чтобы среагировать на изменения в размере шрифта, код должен изменить шрифт по умолчанию на IconTitleFont.
Использование шрифта рабочего стола и реагирование на изменения схемы шрифтов
Создайте форму и добавьте в нее необходимые элементы управления. Дополнительные сведения см. в разделах Практическое руководство. Создание приложения Windows Forms из командной строки и Элементы управления для использования в Windows Forms.
Добавьте в код ссылку на пространство имен Microsoft.Win32.
using Microsoft.Win32;
Imports Microsoft.Win32
Добавьте следующий код в конструктор формы, чтобы подключить необходимые обработчики событий и изменить шрифт по умолчанию, используемый для формы.
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
Реализуйте обработчик для события 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
Наконец, реализуйте обработчик для события 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
Скомпилируйте и запустите код.
Изменение схемы шрифтов в Windows XP вручную
Пока работает приложение Windows Forms, щелкните правой кнопкой мыши на рабочем столе Windows и выберите пункт Свойства в контекстном меню.
В диалоговом окне Свойства экрана перейдите на вкладку Внешний вид.
В раскрывающемся списке Размер шрифта выберите новый размер шрифта.
Вы заметите, что теперь форма реагирует на изменения в схеме шрифтов рабочего стола во время выполнения. Когда пользователь выбирает обычные, крупные и очень крупные шрифты, форма изменяет шрифт и масштабируется надлежащим образом.
Пример
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. Удалите эту строку кода, если вы создаете приложение в командной строке.
См. также
.NET Desktop feedback
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по