FontDialogクラスを利用すると、フォント選択ダイアログボックスを出すことができます。
FontDialogクラスは、CommonDialogクラスから継承されてきています。
System.Object 
   System.MarshalByRefObject 
     System.ComponentModel.Component 
       System.Windows.Forms.CommonDialog 
        System.Windows.Forms.FontDialog
このダイアログで、選択したフォントはFontプロパティで取得できます。また、Fontプロパティを設定することで、ダイアログをそのフォントの設定状態にできます。
public Font Font { get; set; }
しかし、フォントの色は取得・設定できません。これには、Colorプロパティを使います。
public Color Color { get; set; }
FontDialog.ShowApplyプロパティは、ダイアログボックスに「適用」ボタンを表示するかどうかを指定します。デフォルトはfalseです。
public bool ShowApply { get; set; }
これをtrueにした場合、Applyイベントに応答しなくてはなりません。FontDialogを継承したクラスでは、FontDialog.OnApplyメソッドをオーバーライドできます。
protected virtual void OnApply ( EventArgs e )また、FontDialog.ShowHelpプロパティをtrueにすると「ヘルプ」ボタンが表示されます。 (デフォルトではfalse)。この場合、CommonDialog.HelpRequestイベントに応答する必要があります。FontDialogクラスを継承したクラスでは、CommonDialog.OnHelpRequestメソッドをオーバーライドすることができます。
public bool ShowApply { get; set; }
protected virtual void OnHelpRequest (
	EventArgs e
)
FontDialog.ShowColorプロパティをtrueにすると、色の選択肢が表示されます。(デフォルトではfalse)
public bool ShowColor { get; set; }
ここで、選択した色はColorプロパティで取得できることはすでに述べました。FontDialog.ShowEffectsプロパティは、下線・取消線の選択を表示するかどうかを指定します。デフォルトではtrueです。
public bool ShowEffects { get; set; }
サンプルでは、出てきませんがFontDialog.FixedPitchOnlyプロパティをtrueにすると、固定ピッチフォントだけがダイアログボックスに表示されます。(デフォルトはfalse)
public bool FixedPitchOnly { get; set; }
では、サンプルを見てみましょう。
// fontdialog01.cs
using System;
using System.Drawing;
using System.Windows.Forms;
class fontdialog01 : Form
{
    public static void Main()
    {
        Application.Run(new fontdialog01());
    }
    public fontdialog01()
    {
        Text = "猫でもわかるC#プログラミング";
        BackColor = SystemColors.Window;
        MainMenu mm = new MainMenu();
        MenuItem miFile = new MenuItem("ファイル(&F)");
        mm.MenuItems.Add(miFile);
        MenuItem miExit = new MenuItem("終了(&X)");
        miExit.Click += new EventHandler(miExit_Click);
        miFile.MenuItems.Add(miExit);
        MenuItem miView = new MenuItem("表示(&V)");
        mm.MenuItems.Add(miView);
        MenuItem miFont = new MenuItem("フォント(&F)");
        miFont.Click += new EventHandler(miFont_Click);
        miView.MenuItems.Add(miFont);
        Menu = mm;
    }
    void miExit_Click(object sender, EventArgs e)
    {
        Close();
    }
    void miFont_Click(object sender, EventArgs e)
    {
        MyFontDialog fontdlg = new MyFontDialog(this);
        DialogResult dr = fontdlg.ShowDialog();
        if (dr == DialogResult.OK)
        {
            Font = fontdlg.Font;
            ForeColor = fontdlg.Color;
            Invalidate();
        }
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        Graphics g = e.Graphics;
        g.DrawString("猫でもわかるC#",
            Font,
            new SolidBrush(ForeColor),
            new PointF(10f, 10f));
    }
}
fontdialog01クラスは、Formクラスを継承しています。Mainメソッドでは、メインフォームを作成しています。
コンストラクタでは、メニューを作成しています。
メニューで「終了」を選択すると、miExit_Clickメソッドが呼ばれ、Closeメソッドによりプログラムを終了します。
メニューから「フォント」を選択すると、MyFontDialogクラスのオブジェクトを作成します。コンストラクタの引数にthisをしている点に注意してください。
ShowDialogメソッドにより、フォント選択ダイアログを見えるようにします。
そのメソッドが、「OK」ボタンを押すことにより制御を返された場合、ダイアログで選択されたFontと、色をこのフォームのFontと、ForeColorプロパティに設定します。
Invalidateメソッドを呼んで、フォームのクライアント領域を再描画させます。
OnPaintメソッドで、このフォームのクライアント領域に描画する内容を指定します。
g.DrawString("猫でもわかるC#",
    Font,
    new SolidBrush(ForeColor),
    new PointF(10f, 10f));
これで、Fontを用いて、ForeColorのブラシで「猫でもわかるC#」と描画されますね。SolidBrushについては、第7章で解説しています。
class MyFontDialog : FontDialog
{
    Form parent;
    public MyFontDialog(Form f)
    {
        parent = f;
        ShowColor = true;
        ShowApply = true;
        ShowHelp = true;
        Font = f.Font;
        Color = f.ForeColor;
    }
    protected override void OnApply(EventArgs e)
    {
        base.OnApply(e);
        parent.Font = Font;
        parent.ForeColor = Color;
        parent.Invalidate();
    }
    protected override void OnHelpRequest(EventArgs e)
    {
        base.OnHelpRequest(e);
        MessageBox.Show("Help", "猫C#", MessageBoxButtons.OK,
            MessageBoxIcon.Information);
    }
}
MyFontDialogクラスは、FontDialogクラスより継承されてきています。コンストラクタの引数にFormを取りどのフォームから呼ばれているかを知ることができます。
コンストラクタでは、引数からもらった呼び出し元のFormをparentフィールドにコピーしています。ShowColor, ShowApply, ShowHelpプロパティをtrueに設定しています。
そして、フォント選択ダイアログのFontプロパティを呼び出し元フォームのFontに指定しています。また、呼び出しもとのFontをこのクラスのFontに設定しています。
同じようにColorプロパティも呼び出しもとのForeColorに設定しています。
「適用」ボタンが押されたときの動作は、OnApplyメソッドをオーバーライドすればよいですね。ここでは、Fontプロパティの値を呼び出し元のFontプロパティに、Colorプロパティの値を呼び出し元のForeColorプロパティにコピーしています。これで、ダイアログに設定したフォントと色の情報が、呼び出し元に伝わります。そして、Invalidateメソッドを呼び出すと呼び出しもとの再描画が起りますね。
ヘルプボタンが押されたときは、OnHelpRequestメソッドが呼び出されます。ここでは単にメッセージボックスを出しているだけです。
もちろんOn系メソッドをオーバーライドできるのは、MyFontDialogクラスがFontDialogクラスから継承されているからです。
では、実行結果を見てみましょう。
メニューの「表示」「フォント」を選択すると、左のようなフォント選択ダイアログが出てきます。この時、ダイアログには現在の親フォームのフォントの状態が反映されています。
ここで、サイズとかフォント名などを変更して、「OK」ボタンを押すか、「適用」ボタンを押すと設定内容が反映されます。「OK」ボタンを押したときは、ダイアログが消え、「適用」ボタンを押したときはダイアログは出現したままです。
左図は、フォントを「MS ゴシック」サイズを24、文字飾りを「下線」、色を「赤」に設定した場合の親フォームです。
Update 28/Nov/2006 By Y.Kumei