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