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

更新 : 2007 年 11 月

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

通常、Windows フォームで使用される既定のフォントは、Microsoft.Win32 名前空間での GetStockObject(DEFAULT_GUI_FONT) への呼び出しで返されたフォントです。この呼び出しで返されたフォントは、画面の解像度を変更したときにのみ変更されます。次の手順に示すように、フォント サイズの変更に応答するには、コードによって既定のフォントを IconTitleFont に変更する必要があります。

デスクトップ フォントを使用して、フォント パターンの変更に応答するには

  1. フォームを作成し、必要なコントロールを追加します。詳細については、「方法 : コマンド ラインから Windows フォーム アプリケーションを作成する」および「Windows フォームで使用するコントロール」を参照してください。

  2. Microsoft.Win32 名前空間への参照をコードに追加します。

    Imports Microsoft.Win32
    
    using Microsoft.Win32;
    
  3. 必要なイベント ハンドラをフックし、フォームで使用する既定のフォントを変更するために、次のコードをフォームのコンストラクタに追加します。

    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);
    
  4. 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;
        }
    }
    
  5. 最後に、UserPreferenceChanged イベント ハンドラをデタッチする、FormClosing イベントのハンドラを実装します。

ms229594.alert_caution(ja-jp,VS.90).gif重要 :

このコードを追加しないと、アプリケーションでメモリ リークが発生します。

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 でフォント パターンを手動で変更するには

  1. Windows フォーム アプリケーションを実行しているときに Windows のデスクトップを右クリックし、ショートカット メニューの [プロパティ] をクリックします。

  2. [画面のプロパティ] ダイアログ ボックスの [デザイン] タブをクリックします。

  3. [フォント サイズ] ボックスで、新しいフォント サイズを選択します。

    フォームは、デスクトップ フォント パターンの実行時の変更に対応します。ユーザーが [標準]、[大]、または [特大] のいずれかに変更すると、フォームのフォントとスケールが適切に変更されます。

使用例

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);
        }
    }
}

次のコード例に示されているコンストラクタには、Visual Studio で新しい Windows フォームを作成するときに定義される InitializeComponent への呼び出しが含まれています。アプリケーションをコマンド ラインで作成する場合は、このコード行を削除してください。

参照

概念

Windows フォームにおける自動スケーリング

参照

PerformAutoScale