カラーダイアログ(ColorDialog)を使ってみる

2023年2月7日

今回は、色をユーザーに指定して頂くためにカラーダイアログを使うやり方を説明していきたいと思います。

ColorDialogを表示するのに必要な参照

ColorDialogを利用する場合は、プロジェクトが以下のアセンブリを参照しているか確認してください。

  • System.Drawing
  • System.Windows.Forms

フォーム(Windows フォーム)をプロジェクトに含んでいる場合は、自動で参照されると思われますが、クラスでプロジェクトを作成した場合、参照されていませんので、手動で参照する必要があります。

ColorDialogの呼び出し

まずはソースコードを表示します。とりあえずできればいいと思う方であれば以下のコードをコピーして頂ければ利用できるかと思います。

//デフォルトカラーを赤に設定
System.Drawing.Color clr = System.Drawing.Color.Red;

using (System.Windows.Forms.ColorDialog dlg = new System.Windows.Forms.ColorDialog())
{

    //デフォルトカラーを設定
    dlg.Color = clr;

    //ダイアログを表示する
    if (dlg.ShowDialog() != DialogResult.OK)
    {
        //OK以外(この場合キャンセル)がクリックされた場合、何も処理せず抜ける
        return;
    }
    //選択した色を取得
    clr = dlg.Color;
}

実行してみると以下のようにカラーダイアログが取得され、デフォルトカラーとして赤が選択されています。

各種パラメータ

ColorDialogの各種パラメータをTipsでいくつか紹介します。パラメータの設定はShowDialogメソッドの前に呼び出します。

色の作成をさせたくない場合

色の作成をさせたくない場合は、以下のプロパティを設定します。デフォルトはtrueになっています。

dlg.AllowFullOpen = false;

カスタムカラーをあらかじめ設定しておきたい場合

作成した色にダイアログ表示の段階で色を入れておきます。
16進表記の場合、「0x」を先頭に付けます。

設定されるRGB値はR(レッド)G(グリーン)B(ブルー)の値になっており、以下のようになります。

//[作成した色]にあらかじめ色を作成しておく(RGB値)
dlg.CustomColors = new int[] {0xFEFEFE, 0xFFAAAA, 0xFF8888, 0xFF6666, 0xFF4444, 0xFF2222,
                                        0xAAFFAA, 0x88FF88, 0x66FF66, 0x44FF44, 0x22FF22,
                                        0xAAAAFF, 0x8888FF, 0x6666FF, 0x4444FF, 0x2222FF};

これを実行すると以下のようになります。

0xFFと設定すると赤色が表示されますが、これは0x0000FFと同義です。

作成した色の保存と読込

ユーザーが作成した色を保存や読込したい場合は、CustomColorsプロパティの値を保存し、次回ダイアログ起動時に再設定してあげればよいです。

CustomColorsはint配列になっているのでこれをファイル、レジストリ、データベースなどに保存してあげることが望ましいですね。今回はファイルに保存するようにします。

EXEがあるフォルダに保存しておくメソッドを作成します。

public bool SaveCustomColors(params int[] colors)
{
    //保存ファイル名
    const string CUSTOM_COLORS_FILE = "cc.xml";

    //保存先のファイルを生成する
    string file = string.Format("{0}\\{1}", System.Windows.Forms.Application.StartupPath, CUSTOM_COLORS_FILE);

    try
    {
        //XMLファイルに保存する
        System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(int[]));

        using (System.IO.StreamWriter sw = new System.IO.StreamWriter(file, false, new System.Text.UTF8Encoding(false)))
        {
            //書き込む
            serializer.Serialize(sw, colors);

            //閉じる
            sw.Close();

        }

        return true;

    }
    catch (Exception ex)
    {
        //エラーが発生した場合、メッセージを表示する
        MessageBox.Show(string.Format("{0}({1})\r\n{2}", ex.Message, ex.InnerException, ex.StackTrace));

        return false;
    }
}

ファイル保存時にエラーが起こる可能性があります。
可能性の一つとしてインストーラーを利用してアプリケーションを「Program Files」にインストールする場合、管理者権限でアプリを起動していないと書き込みで失敗します。
そのため、成功(true)、失敗(false)の戻り値を返しています。

読み込み処理は以下のようにしました。

public int[] LoadCustomColors()
{
    //保存ファイル名
    const string CUSTOM_COLORS_FILE = "cc.xml";

    //保存先のファイルを生成する
    string file = string.Format("{0}\\{1}", System.Windows.Forms.Application.StartupPath, CUSTOM_COLORS_FILE);

    //戻り値の宣言
    int[] res = null; 

    try
    {
        //ファイル存在チェック
        if (System.IO.File.Exists(file) == false)
        {
            return null;
        }

        //XMLファイルに保存する
        System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(int[]));

        using (System.IO.StreamReader sr = new System.IO.StreamReader(file, new System.Text.UTF8Encoding(false)))
        {
            //読み込む
            res = (int[])serializer.Deserialize(sr);

            //閉じる
            sr.Close();

        }

        return res;

    }
    catch (Exception ex)
    {
        //エラーが発生した場合、メッセージを表示する
        MessageBox.Show(string.Format("{0}({1})\r\n{2}", ex.Message, ex.InnerException, ex.StackTrace));

        return null;
    }
}

この保存まで考慮してプログラムは以下のようになりました。

//デフォルトカラーを赤に設定
System.Drawing.Color clr = System.Drawing.Color.Red;

using (System.Windows.Forms.ColorDialog dlg = new System.Windows.Forms.ColorDialog())
{

    //デフォルトカラーを設定
    dlg.Color = clr;

    //保存してある[作成した色]を読み込みます。
    dlg.CustomColors = LoadCustomColors();

    //ダイアログを表示する
    if (dlg.ShowDialog() != DialogResult.OK)
    {
        //OK以外(この場合キャンセル)がクリックされた場合、何も処理せず抜ける
        return;
    }

    //選択した色を取得
    clr = dlg.Color;

    //作成した色を保存
    SaveCustomColors(dlg.CustomColors);
}

まとめ

カラーダイアログの説明をしました。

直接関係ありませんが、ファイルの保存時にXmlシリアライザーを利用しています。
ファイル保存するのにいちいちStringに直し、読み込み時に型を戻す処理を書かなくて済むので便利です。

実際仕事しているとファイルに書き出すときに、Stringに変換して保存するようなことをしているソースコードをよく見かけます。こういうのを知っていると楽にできて便利だと思います。

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