方法: Windows フォーム アプリケーションでのフォント パターンの変更に応答する

Windows オペレーティング システムでは、ユーザーはシステム全体のフォント設定を変更して、既定のフォントのサイズを大きく、または小さくすることができます。 これらのフォント設定の変更は、視覚に障碍があり、画面上のテキストを読むために大きな種類を必要とするユーザーにとって非常に重要です。 フォント パターンが変更されたら常にフォームとすべての含まれるテキストのサイズを拡大または縮小することにより、これらの変更に対応するように Windows フォーム アプリケーションを調整できます。 フォームでフォント サイズの変更に動的に対応する場合は、フォームにコードを追加できます。

通常、Windows フォームで使用される既定のフォントは、GetStockObject(DEFAULT_GUI_FONT) への Microsoft.Win32 名前空間の呼び出しによって返されるフォントです。 この呼び出しによって返されるフォントは、画面の解像度が変更された場合にのみ変更されます。 次の手順で示すように、フォント サイズの変更に対応してコードで既定のフォントを 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. Window カテゴリが変更されたときにフォームを自動的に拡大縮小させる UserPreferenceChanged イベントのハンドラーを実装します。

    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 フォーム アプリケーションが実行されている間に、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 フォーム プロジェクトを作成するときに定義されます。 コマンド ラインでアプリケーションをビルドする場合は、このコード行を削除します。

関連項目