第42章 モードレス・ダイアログボックス


通常のダイアログボックス(タスク・モーダル)では、ダイアログボックスが表示されている間、メインフォームの操作は一切不能でした。ダイアログボックスが表示されていても、親フォームの操作が可能なものがモードレス・ダイアログボックスです。



モードレス・ダイアログボックスの代表的なものは、メモ帳の「検索」ダイアログボックスでしょう。

では、どのように作るかというと、モーダル・ダイアログボックスとほとんど同じです。モーダル・ダイアログボックスでは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プロパティを設定してもダイアログは閉じません。

では、実行結果を見てみましょう。

ダイアログボックスが表示されている状態でも、親フォームのメニューを操作できるので、多数のモードレス・ダイアログボックスを表示することができます。

親フォームを最小化すると、全部最小化されます。




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

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