如何:回應 Windows Forms 應用程式中的字型配置變更

在 Windows 作業系統中,使用者可以變更全系統的字型設定,使預設字型顯得更大或更小。 對於有視力障礙,且需要較大的字型才能在其螢幕閱讀文字的使用者而言,變更這些字型設定是非常重要的。 您可以在字型配置有所變更時調整 Windows Forms 應用程式,以因應這些變更,方法是增加或縮減表單大小和所有包含的文字。 如果您想要讓表單動態因應字型大小的變更,您可以將程式碼新增至表單。

Windows Forms 所使用的預設字型通常是 Microsoft.Win32 命名空間呼叫 GetStockObject(DEFAULT_GUI_FONT) 時傳回的字型。 此呼叫所傳回的字型只會在螢幕解析度變更時變更。 如下列程序所示,您的程式碼必須將預設字型變更為 IconTitleFont,以因應字型大小的變更。

使用桌面字型並因應字型配置變更

  1. 建立表單,並為其新增您要的控制項。 如需詳細資訊,請參閱操作說明:從命令列建立 Windows Forms 應用程式在 Windows Form 上使用的控制項

  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. 最後,為中斷連結 UserPreferenceChanged 事件處理常式的 FormClosing 事件實作處理常式。

    重要

    若未能包含此程式碼,將導致應用程式流失記憶體。

    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 的呼叫,這是您在使用 Visual Studio 建立新的 Windows Forms 專案時定義的。 如果您要在命令列上建置應用程式,請移除這一行程式碼。

另請參閱