在 Windows作系统中,用户可以更改系统范围的字体设置,以使默认字体显示更大或更小。 更改这些字体设置对于视力受损的用户至关重要,需要更大的类型才能阅读其屏幕上的文本。 你可以调整 Windows 窗体应用程序,以在字体方案发生更改时,通过增加或减小窗体和其中所有文本的大小来应对这些变化。 如果希望窗体动态适应字体大小的更改,可以向窗体添加代码。
通常,Windows 窗体使用的默认字体是命名空间调用Microsoft.Win32返回的GetStockObject(DEFAULT_GUI_FONT)字体。 此调用返回的字体仅在屏幕分辨率更改时更改。 如以下过程所示,代码必须更改默认字体以 IconTitleFont 响应字号更改。
使用桌面字体并对字体方案的变化作出响应
创建表单,并添加您希望的控件。 有关详细信息,请参阅 如何:通过命令行创建 Windows 窗体应用程序 和 在 Windows 窗体上使用的控件。
向代码添加对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 窗体应用程序正在运行时,右键单击 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,该调用是在您使用 Visual Studio 创建新的 Windows 窗体项目时定义的。 如果要在命令行上生成应用程序,请删除此代码行。