モードレス・ダイアログボックスの代表的なものは、メモ帳の「検索」ダイアログボックスでしょう。
では、どのように作るかというと、モーダル・ダイアログボックスとほとんど同じです。モーダル・ダイアログボックスでは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