C#で作るWindowsアプリ
−複数のウインドウ−


[トップ] [目次] [←前] [次→]

ダイアログを表示する

ダイアログを作ってみましょう。
今回もコードから


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111

namespace Sample3 {
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    public class MyDialog : Form {
        // コンストラクタ
        public MyDialog() {
            Label lbl = new Label();
            lbl.Text = "ダイアログです";
            Controls.Add(lbl);
            
            Button btn = new Button();
            btn.Text = "OK";
            btn.Location = new Point (10, 30);
            btn.DialogResult = DialogResult.OK;
            this.AcceptButton = btn;
            this.Controls.Add(btn);
            
            btn = new Button();
            btn.Text = "キャンセル";
            btn.Location = new Point (120, 30);
            btn.DialogResult = DialogResult.Cancel;
            this.CancelButton = btn;
            this.Controls.Add(btn);
            
            this.MaximizeBox = false;            // 最大化ボタンなし
            this.MinimizeBox = false;            // アイコン化ボタンなし
            this.ShowInTaskbar = false;          // タスクバーに出さない
            this.FormBorderStyle = FormBorderStyle.FixedDialog;     // ダイアログスタイル
            this.StartPosition = FormStartPosition.CenterScreen;    // 画面中央に表示
        }
    }
    
    public class MyForm : Form {
        // Main
        public static void Main(string[] args) {
            MyForm frm = new MyForm();
            Application.Run(frm);
        }
        
        // コンストラクタ
        public MyForm() {
            // メインメニューを生成
            MainMenu mm = new MainMenu();
            
            // ファイルメニューを生成
            MenuItem mi = mm.MenuItems.Add("ファイル(&F)");
            mi.MenuItems.Add(new MenuItem("開く(&O)...", new EventHandler(this.FileOpen_Clicked)));
            mi.MenuItems.Add("-");
            mi.MenuItems.Add(new MenuItem("終了(&X)", new EventHandler(this.FileExit_Clicked), Shortcut.CtrlQ));
            
            // ヘルプメニューを生成
            mi = mm.MenuItems.Add("ヘルプ(&H)");
            mi.MenuItems.Add(new MenuItem("バージョン情報(&A)...", new EventHandler(this.HelpAbout_Clicked)));
            
            // フォームのメニューとしてセット
            this.Menu = mm;
            
            // 開くボタンを生成
            Button btn = new Button();
            btn.Text = "開く...";
            btn.Location = new Point(2, 2);    // 座標を設定
            btn.Size = new Size(100, 22);      // サイズを設定
            btn.TabIndex = 0;                  // タブ順は最初
            btn.Anchor = AnchorStyles.Top | AnchorStyles.Left;  // 左上を固定
            btn.Click += new EventHandler(this.OpenButton_Clicked);
            this.Controls.Add(btn);
            
            // テキストボックスを生成
            TextBox txt = new TextBox();
            txt.Text = "";
            txt.Location = new Point(0, 26);   // 座標を設定
            txt.Size = new Size(this.ClientSize.Width, this.ClientSize.Height - 26);
                                               // サイズを設定
            txt.Multiline = true;              // 複数行OKにする
            txt.ScrollBars = ScrollBars.Both;  // スクロールバーを表示
            txt.BackColor = Color.White;       // 背景色を白にする
            txt.TabIndex = 1;                  // タブ順は2番目
            txt.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
                                               // 上下左右とも固定
            Controls.Add(txt);
        }
        
        // ファイル−開くメニューのイベントハンドラ
        private void FileOpen_Clicked(object sender, EventArgs e) {
            MessageBox.Show("ファイル−開くメニューがクリックされました.");
        }
        
        // ファイル−終了メニューのイベントハンドラ
        private void FileExit_Clicked(object sender, EventArgs e) {
            this.Close();
        }
        
        // ヘルプ−バージョン情報メニューのイベントハンドラ
        private void HelpAbout_Clicked(object sender, EventArgs e) {
            MyDialog dlg = new MyDialog();
            dlg.ShowDialog();
            if (dlg.DialogResult == DialogResult.OK) {
                MessageBox.Show("OKボタンが押されました.");
            } else {
                MessageBox.Show("キャンセルボタンが押されました.");
            }
        }
        
        // 開くボタンのイベントハンドラ
        private void OpenButton_Clicked(object sender, EventArgs e) {
            MessageBox.Show("開くボタンがクリックされました.");
        }
    }
}
Sample3.cs

コンパイル

csc /t:winexe /r:System.DLL /r:System.Windows.Forms.DLL /r:System.Drawing.DLL Sample3.cs

これでコンパイルできるはずです。
前回とはファイル名が違うだけです。

ダイアログクラス

実はダイアログ用のクラスがあるわけじゃありません。 6行目のようにダイアログもFormクラスで作ります。 ただ、そのままじゃサイズ変更もできちゃいますし、最大化とかアイコン化もできちゃってダイアログらしくありません。 なので、27〜31行目のようにプロパティを設定して、いかにもダイアログらしくするだけです。

OKボタンとキャンセルボタン

ダイアログにあるOKボタンとキャンセルボタンはちょっと特別扱いしてやります。
13〜25行目を見てください。
まず、ボタン自体のDialogResultプロパティにDialogResult.OKやDialogResult.Cancelをセットしてあげます。 これで、「あんたはOKボタンなんだよ」とかって教えてあげます。
さらにFormのAcceptButtonプロパティ(これがOKボタン)やCancelButtonプロパティに対応するボタンをセットしてあげます。
もう、これは、ダイアログを作るときのお約束と思っていいです。 必ず、こうしましょう。

ダイアログを表示する

97〜103行目のように表示したいダイアログを作ってShowDialogメソッドを呼ぶだけです。 OKボタンが押されたのかキャンセルされたのかは、DialogResultプロパティでわかるようになってます。

ところでモードレスダイアログは?

今までのサンプルはモーダルダイアログでした。 モーダルダイアログってのは、ダイアログを出してる間は後ろのウインドウが使えないってやつです。
これをモードレスにしてみましょう(ダイアログを出しながら後ろのウインドウも使える)。

と言っても、98行目のdlg.ShowDialog();のところを


dlg.Owner = this;
dlg.Show();

としてやるだけです。
こうするとダイアログを出している間も後ろのウインドウが使えますし、その間もダイアログは前面に出たままになります。
ただ、ShowDialogメソッドはダイアログが閉じるまで制御が返ってきませんが、Showメソッドはダイアログが表示されるとすぐに制御が戻ってきます。 なので、99〜103行目の


if (dlg.DialogResult == DialogResult.OK) {
    MessageBox.Show("OKボタンが押されました.");
} else {
    MessageBox.Show("キャンセルボタンが押されました.");
}

の部分は取ってやらないといけません。

普通のウインドウは?

モードレスダイアログじゃなく、普通のウインドウ(ようするに、後ろに隠れることもあるウインドウ)にしてみます。
これまた、dlg.Owner = this;せずにdlg.Show();するだけです。

結局、Ownerをセットしなければ普通のウインドウ、OwnerをセットすればOwnerの後ろに隠れることはないウインドウ(モードレスダイアログ)って違いがあるだけです。


[トップ] [目次] [←前] [次→]

株式会社ディーバ 青柳 臣一
2002/03/05