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