第44章 フォント選択ダイアログボックス


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、文字飾りを「下線」、色を「赤」に設定した場合の親フォームです。




[C# フォーム Index] [C# コンソール Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 28/Nov/2006 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。