通常のダイアログボックス(タスク・モーダル)では、ダイアログボックスが表示されている間、メインフォームの操作は一切不能でした。ダイアログボックスが表示されていても、親フォームの操作が可能なものがモードレス・ダイアログボックスです。
モードレス・ダイアログボックスの代表的なものは、メモ帳の「検索」ダイアログボックスでしょう。
では、どのように作るかというと、モーダル・ダイアログボックスとほとんど同じです。モーダル・ダイアログボックスではShowDialogメソッドを利用しましたが、モードレスの場合はShowメソッドを用います。
また、呼び出し元のフォームをOwnerプロパティに設定する必要があります。Form.Ownerプロパティは次のように定義されています。
public Form Owner { get; set; }
プロパティ値は対象のフォームを所有しているフォームです。フォームが他のフォームに所有されていると、所有者が閉じると、一緒に閉じられます。 また、所有者が最小化されると非所有者も最小化されます。また、所有者は常に非所有者の背面に位置します。
では、簡単なモードレス・ダイアログボックスのサンプルを見てみましょう。
using System;
using System.Drawing;
using System.Windows.Forms;
class modeless01 : Form
{
public static void Main()
{
Form form = new modeless01();
Application.Run(form);
}
public modeless01()
{
Text = "猫でもわかるC#プログラミング";
BackColor = SystemColors.Window;
MenuItem miExit = new MenuItem("終了(&X)",
new EventHandler(miExit_Click));
MenuItem miDialog = new MenuItem("ダイアログを出す(&D)",
new EventHandler(miDialog_Click));
MenuItem miFile = new MenuItem("ファイル(&F)",
new MenuItem[] { miExit });
MenuItem miOption = new MenuItem("オプション(&O)",
new MenuItem[] { miDialog });
Menu = new MainMenu(new MenuItem[] { miFile, miOption });
}
void miExit_Click(object sender, EventArgs e)
{
MenuItem mi = (MenuItem)sender;
MainMenu mm = mi.GetMainMenu();
Form fm = mm.GetForm();
fm.Close();
}
void miDialog_Click(object sender, EventArgs e)
{
MyModeless dlg = new MyModeless(this);
dlg.Show();
}
}
Mainメソッドでは、親フォームを作っています。コンストラクタでは、メニューを作成しています。
メニューの「終了」が選択されるとmiExit_Clickメソッドが呼び出されますが、ここで今までとはちょっと違うことをしています。
引数の、senderは、メニュー項目です。まず、これのメインメニューをGetMainMenuメソッドで探しています。
public MainMenu GetMainMenu ()メインメニューがわかったら、GetFormメソッドで、このメニューを所有しているフォームを探しています。
public Form GetForm ()そして、フォームを閉じています。
メニューの「ダイアログを出す」が選択されると、miDialog_Clickメソッドが呼び出されます。
MyModeless dlg = new MyModeless(this); dlg.Show();で、モードレス・ダイアログボックスを作成して表示しています。コンストラクタの引数にthisを指定して、所有者のフォームを教えています。
class MyModeless : Form
{
public MyModeless(Form f)
{
Text = "モードレス・ダイアログボックス";
Owner = f;
FormBorderStyle = FormBorderStyle.FixedDialog;
MinimizeBox = false;
MaximizeBox = false;
ControlBox = false;
ShowInTaskbar = false;
Button btn = new Button();
btn.Text = "閉じる";
btn.Location = new Point((ClientSize.Width - btn.Width) / 2,
ClientSize.Height - btn.Height - 5);
btn.Parent = this;
btn.Click += new EventHandler(btn_Click);
}
void btn_Click(object sender, EventArgs e)
{
Close();
}
}
モードレス・ダイアログボックスのクラスです。コンストラクタの引数から、オーナーを指定している点に注意してください。
また、モードレス・ダイアログボックスの場合、ボタンにDialogResultプロパティを設定してもダイアログは閉じません。
では、実行結果を見てみましょう。
ダイアログボックスが表示されている状態でも、親フォームのメニューを操作できるので、多数のモードレス・ダイアログボックスを表示することができます。
親フォームを最小化すると、全部最小化されます。
Update 26/Nov/2006 By Y.Kumei