如何:在 Windows 窗体应用程序中响应字体方案更改
更新:2007 年 11 月
在 Windows 操作系统中,用户可以更改系统级的字体设置,使默认字体显示得更大或更小。更改这些字体设置对于视力受损的用户尤为关键,因为他们需要屏幕上显示较大的文本才能进行阅读。每当字体方案发生更改时,可以通过增加或减小窗体以及所有包含文本的大小,来调整 Windows 窗体应用程序以响应这些更改。如果想让窗体动态适应字号的更改,可以向窗体添加代码。
通常,Windows 窗体使用的默认字体是 Microsoft.Win32 命名空间调用 GetStockObject(DEFAULT_GUI_FONT) 所返回的字体。此调用所返回的字体只在屏幕分辨率发生变化时才会更改。如下面的过程所示,您的代码必须将默认字体更改为 IconTitleFont,以响应字号的更改。
使用桌面字体和响应字体方案更改
创建窗体,并向该窗体添加您需要的控件。有关更多信息,请参见如何:从命令行创建 Windows 窗体应用程序和在 Windows 窗体上使用的控件。
向代码中添加对 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 窗体应用程序运行期间,右击 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 的调用,该组件是您在 Visual Studio 中创建新的 Windows 窗体项目时定义的。如果通过命令行生成应用程序,请移除此行代码。