ダイアログボックス

ダイアログボックスの種類

種類 動作
モーダル (modal) 閉じられるまでは処理を戻さないため、呼び出し側の操作は制限される

モーダル ウィンドウは、メイン ウィンドウとのユーザー対話を無効にするモード (mode) を作成する Modal window - Wikipedia

モードレス (modeless) / 非モーダル (non-modal) すぐに処理を戻すため、呼び出し側の操作は制限されない

モーダル ダイアログボックス

public DialogResult ShowDialog()
ShowDialog() - Form.ShowDialog メソッド (System.Windows.Forms) | Microsoft Learn

ShowDialog()を呼び出すと、それによって表示されたダイアログボックスが閉じられるまで、呼び出し側に制御が戻りません。

DialogResultプロパティに設定されるとフォームは非表示になり、呼び出し側に制御が戻ります。Remarks - Form.DialogResult Property (System.Windows.Forms) | Microsoft Learn

モーダルで表示されているフォームが閉じられるときにDialogResultがNoneだと、DialogResult.Cancelに設定されます。WmClose - Form.cs

引数のないShowDialog()はShowDialog(null)とするのと等しく、現在アクティブなウィンドウが所有者となります。ShowDialog() - Form.cs

using (Form form = new Form())
{
    if (form.ShowDialog() == DialogResult.OK)
    {
        //
    }
}

ShowDialog()で開いたダイアログボックスは閉じられても非表示になるだけのため、不要になったら明示的にDispose()を呼び出し破棄します。

モードレス ダイアログボックス

public void Show()
Control.Show メソッド (System.Windows.Forms) | MSDN

Show()では呼び出し側の操作は制限されませんが、呼び出し側とは同一のスレッドで処理されます。

Form form = new Form();
form.Show();

Show()の呼び出しは、form.Visible = trueとすることと同義です。よって呼び出すフォームが内部でVisible = trueとしていると、Show()を呼び出すことなく表示されます。

Ownerプロパティ

Ownerプロパティにダイアログボックスを開いたフォームを指定することで、その親フォームの前面に表示されるようになり、親フォームの最小化や閉じる操作に連動するようになります。Form.Owner プロパティ (System.Windows.Forms) | MSDN

Form form = new Form();
form.Owner = this;
form.Show();

これはShow()の呼び出しで、form.Show(this)のように引数で渡しても同じです。

初期状態で表示される位置

StartPositionプロパティで設定できます。

閉じられることを拒否

OnFormClosing()をオーバーライドして、そこでCancelEventArgs.Cancelにtrueを設定することでダイアログが閉じられることを拒否できます。

そのとき閉じられる理由はFormClosingEventArgs.CloseReasonや、DialogResultプロパティで確認できます。

コンソール アプリケーションでの利用

Formにはグラフィックを描画できるため、コンソール アプリケーションで利用することで図形などを表示できます。

using (Form form = new Form())
{
    form.Paint += delegate (object sender, PaintEventArgs e)
    {
        Point[] points = { new Point(10, 0), new Point(20, 30), new Point(0, 10), };

        Graphics g = e.Graphics;
        g.DrawLines(Pens.Black, points);
    };

    form.ShowDialog();
}

参考

参考書

Microsoft Learnから検索