C#では、ダイアログボックスは、基本的にフォームと同じです。
一般的に、ダイアログボックスと言えば、タスクモーダル・ダイアログボックスを指します。これは、ダイアログボックスが表示されている間、その親の操作ができません。
Win32APIプログラミングでは、システムモーダルなダイアログボックスも作成可能でしたがC#では、作成できないことになっています。
では、ダイアログボックスを作るにはどうしたらよいでしょうか。
1.呼び出し側のフォームでFormオブジェクトを作成する 2.ShowDialogメソッドで、このダイアログを見えるようにするたったこれだけです。しかし、通常ダイアログボックスには、システムメニューボタン、最大化・最小化ボタンがないのが普通です。また、サイズも変更不能であることが一般的です。そこで、ダイアログボックスとして利用するフォームのプロパティは
1.ControlBox, MaximizeBox, MinimizeBoxをfalseに設定する 2.FormBorderStyleをFormBorderStyle.FixedDialogに設定するまた、ダイアログボックスがWindowsのタスクバーに表示させないようにするため
ShowInTaskbarをfalseに設定することが必要です。また、ダイアログボックスは「OK」とか「キャンセル」ボタンを押したときに閉じるのが普通です。これには、Button.DialogResultプロパティを設定します。
これは、親フォームがShowDialogメソッドで表示されている場合、ボタンをクリックすると親フォームが自動的に閉じてくれます。
では、サンプルを見てみましょう。
// dialog01.cs
using System;
using System.Drawing;
using System.Windows.Forms;
class dialog01 : Form
{
    public static void Main()
    {
        Application.Run(new dialog01());
    }
    public dialog01()
    {
        Text = "猫でもわかるC#プログラミング";
        BackColor = SystemColors.Window;
        MainMenu mm = new MainMenu();
        Menu = mm;
        MenuItem miFile = new MenuItem();
        miFile.Text = "ファイル(&F)";
        mm.MenuItems.Add(miFile);
        MenuItem miExit = new MenuItem();
        miExit.Text = "終了(&X)";
        miExit.Click += new EventHandler(miExit_Click);
        miFile.MenuItems.Add(miExit);
        MenuItem miOption = new MenuItem();
        miOption.Text = "オプション(&O)";
        mm.MenuItems.Add(miOption);
        MenuItem miDialog = new MenuItem();
        miDialog.Text = "ダイアログボックスを出す(&D)";
        miDialog.Click += new EventHandler(miDialog_Click);
        miOption.MenuItems.Add(miDialog);
    }
    void miDialog_Click(object sender, EventArgs e)
    {
        MyDialog mydlg = new MyDialog();
        mydlg.ShowDialog();
    }
    void miExit_Click(object sender, EventArgs e)
    {
        Close();
    }
}
class MyDialog : Form
{
    public MyDialog()
    {
        Text = "ダイアログボックス";
        FormBorderStyle = FormBorderStyle.FixedDialog;
        ControlBox = false;
        ShowInTaskbar = false;
        MaximizeBox = false;
        MinimizeBox = false;
        Button btnOK = new Button();
        btnOK.Text = "OK";
        btnOK.Parent = this;
        btnOK.Location = 
            new Point((ClientSize.Width - btnOK.Width) / 2,
            ClientSize.Height - btnOK.Height - 10);
        btnOK.DialogResult = DialogResult.OK;
    }
}
メニューの「ダイアログボックスを出す」を選択すると、miDialog_Clickメソッドが呼び出されます。このメソッドでは単に
MyDialog mydlg = new MyDialog(); mydlg.ShowDialog();と、しているだけです。これでダイアログボックスが出現します。このダイアログボックスのプロパティは、MyDialog(Formクラスを継承)クラスのコンストラクタで設定しています。
また、ダイアログボックス上の「OK」ボタンのDialogResultプロパティにDialogResult.OKを設定してますが、このボタンが押されると親のダイアログが閉じます。またShowDialogメソッドの戻り値がDialogResult.OKとなります(このプログラムでは利用していない)。呼び出し元では、どのボタンが押されてダイアログが閉じたのかがわかります。
簡単ですね。
実行結果は次のようになります。
メニューの「オプション」「ダイアログボックスを出す」を選択します。
このダイアログか表示されている間、親フォームのメニュー等は一切操作ができなくなります。
Update 23/Nov/2006 By Y.Kumei