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