如何:在 Windows 窗体应用程序中响应字体方案更改

在 Windows 操作系统中,用户可以更改整个系统的字体设置,使默认字体显示得更大或更小。 更改这些字体设置对视力受损并且需要更大的字体类型才能在其屏幕上阅读文本的用户至关重要。 当字体方案更改时,你可以调整 Windows 窗体应用程序来响应这些变化,具体方法是增大或减少窗体及其中所有文本的大小。 如果希望窗体动态适应字号的更改,可以向窗体添加代码。

通常,Windows 窗体使用的默认字体是 Microsoft.Win32 命名空间调用返回给 GetStockObject(DEFAULT_GUI_FONT) 的字体。 此调用返回的字体仅在屏幕分辨率更改时发生更改。 如以下过程所示,代码必须将默认字体更改为 IconTitleFont 才能响应字号的更改。

使用桌面字体并响应字体方案更改

  1. 创建窗体,并向其添加所需的控件。 有关详细信息,请参阅如何:通过命令行创建 Windows 窗体应用程序在 Windows 窗体上使用的控件

  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 窗体应用程序运行时,右键单击 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 的调用,该调用是你在 Visual Studio 中新建 Windows 窗体项目时定义的。 如果要在命令行上生成应用程序,请删除此代码行。

另请参阅