【C#】ダイアログを自作してみる

2021年4月5日

こんにちは、ノムノムです。

今回は自分でダイアログを自作する方法をお話しします。

ダイアログ

ダイアログとはユーザーに任意に設定を入力させたり、メッセージを伝えるために使うアプリケーションのサブ画面のことです。

ダイアログといっても元はフォーム

ダイアログボックスを表示すると言っても画面自体はフォームを元にしたものなので、何か別のオブジェクトが存在するとかではないです。

ダイアログは、フォームのプロパティを変更したものになります。

特に難しい処理はいりません。プログラムを作成していくとファイル参照ダイアログ(OpenFileDialog)などのあらかじめ用意されているダイアログではできないダイアログを使いたい日が必ずきます。

例えば、アプリを実行する設定画面や進行状況を表示するプログレスバーのダイアログなどです。

これらは用意されていないの自分で作るしかありません。

ダイアログを作ってみよう

さっそくダイアログの作り方を説明していきます。

手順1.フォームを追加する

まずはWindows フォームを追加します。プロジェクトを右クリックして「追加」を選択してください。
その中からWindow フォームを選択します。

フォーム名を入力してフォームを新規追加します。今回は「myDialog」としました。
フォーム名は、使いやすい名前を入力して頂ければいいです。

手順2.フォームのプロパティを設定

次にダイアログのような動作するためにプロパティを設定します。
プロパティは以下の画像の場所です。

プロパティを変更する内容を以下の表にしてみました。

プロパティ名説明
ControlBoxFalseフォームのシステムメニューボックスを表示するか決定します。
Trueの場合
 
Falseの場合
FormBorderStyleNone
または
FixedDialog
フォームの境界線やタイトルバーなどの外観を設定します。
Noneにするとタイトルバーと境界線がなくなります。
FixedDialogにするとフォームのサイズ変更ができなくなります。
MaximizeBoxFalse最大化ボタンを表示するか決定します。
MinimizeBoxFalse 最小化ボタンを表示するか決定します。
Size任意フォームのサイズを設定します。
StartPositionCenterParent
または
CenterScreen
フォームの初期表示位置
CenterParentは、呼び出したフォームの中心に表示されます。
CenterScreenは、画面中央に表示されます。
TopMostTrue常に最前面に表示するか決定します。

手順3.コントロールを配置

ここまでくればあとは自分のやりたいようにコントロールを配置してください。

今回は、文字入力をするダイアログにしました。

手順4.戻り値を設定(サンプルソース)

上記のダイアログの張りぼてを作ったら次は中身ですね。サンプルでは文字を入力して入力した値を取得するために以下のようにしました。

public partial class myDialog : Form
{
    private string _input_text = "";

    public myDialog()
    {
        InitializeComponent();
    }

    private void btnOK_Click(object sender, EventArgs e)
    {
        //ダイアログの戻り値をOKに設定
        this.DialogResult = DialogResult.OK;

        //入力内容を取得
        _input_text = this.txtInput.Text;

        //ダイアログを閉じる
        this.Close();
    }

    private void btnCancel_Click(object sender, EventArgs e)
    {
        //ダイアログの戻り値をキャンセルに設定
        this.DialogResult = DialogResult.Cancel;

        //ダイアログを閉じる
        this.Close();
    }

    public string GetInputText()
    {
        return _input_text;
    }
}

OKを押したのかキャンセルを押したのか分かるようにフォームDialogResultプロパティに結果をセットしています。これがダイアログのポイントになります。

手順5.呼び出してみる(サンプルソース)

ダイアログが完成したので呼び出してみます。

using (myDialog dlg = new myDialog())
{
    if (dlg.ShowDialog() == DialogResult.OK)
    {
        //OKがクリックされた場合
        MessageBox.Show(dlg.GetInputText());
    } else
    {
        //キャンセルがクリックされた場合
        MessageBox.Show("キャンセルされました。");
    }
}

先ほどポイントといったフォームのDialogResultプロパティに設定した値がShowDialog関数の戻り値として渡されます。

Dialogを閉じても見えないだけでインスタンスとして残っているのでその後、テキストに入力した値を取得しています。
ただし、usingから抜けた後は、使用できませんので注意してください。

実行してみる

それでは実行してみます。

OKボタン、キャンセルボタンも機能しました。また初期表示位置も親フォームの中心であり、サイズ変更もできない。最大化、最小化、xボタンもない状態で表示できました。

良さそうですね。1点だけ手順3のコントロール配置の時は、 FormBorderStyleプロパティ をNoneに設定していましたが、表示時に少々見づらかったので FormBorderStyle プロパティをFixedDialogに変更しました。

あえて画像を差し替えなかったのは、最初からがっちり決めなくても後から変えてもいいんだと思って欲しいからです。差し替えが面倒だということではない・・・はず。

まとめ

自分でダイアログを作れるようになるとアプリの幅が広がりますね。

VisualStudioでWindowsアプリを作るには、覚えておいた方がいいテクニックです。
他のプログラミングツールではあまり有用ではないのが残念です。

ここまで読んでいただいてありがとうございます。