一般的に、ダイアログボックスと言えば、タスクモーダル・ダイアログボックスを指します。これは、ダイアログボックスが表示されている間、その親の操作ができません。
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