カラー参照ダイアログ

ダイアログ

カラー参照ダイアログについて説明します。

カラー参照ダイアログ

以下の簡単なソースコードを記述します。特に細かい設定がいらなければ以下をコピペすればOKです。

Color select_color = Color.Transparent;

using (ColorDialog dlg = new ColorDialog())
{
    //OK以外は処理を抜ける               
    if (dlg.ShowDialog() != DialogResult.OK)
    {
        return;
    }

    //選んだ色を取得
    select_color = dlg.Color;
}

最初から色の作成を展開しておく方法

色の作成画面を表示しておきたい場合は以下のようにFullOpenプロパティをtrueにしておきます。

Color select_color = Color.Transparent;

using (ColorDialog dlg = new ColorDialog())
{
    dlg.FullOpen = true;

    //OK以外は処理を抜ける               
    if (dlg.ShowDialog() != DialogResult.OK)
    {
        return;
    }

    //選んだ色を取得
    select_color = dlg.Color;
}

作成した色をはじめからセットしておく方法

作成した色をあらかじめセットしておきたい場合は、CustomColorsプロパティにint型で色をセットすれば表示されます。解説で説明されていますが単純にToArgb()メソッドではできません。

Color select_color = Color.Transparent;

using (ColorDialog dlg = new ColorDialog())
{
    dlg.SolidColorOnly = false;

    dlg.CustomColors = new int[]
    {
        0xFF0000,
        0x00FF00,
        0x0000FF,
        GetColorInt(Color.Aquamarine),
        GetColorInt(Color.BurlyWood),
        GetColorInt(Color.DarkBlue),
        GetColorInt(Color.MistyRose)
    };

    //OK以外は処理を抜ける               
    if (dlg.ShowDialog() != DialogResult.OK)
    {
        return;
    }

    //選んだ色を取得
    select_color = dlg.Color;
}
private int GetColorInt(Color color)
{
    return color.B << 16 | color.G << 8 | color.R;
}

解説

アクアマリンは、赤「127」緑「255」青「212」です。16進法でいくと赤「7F」緑「FF」青「D4」になります。なのでRGBなら0x7FFFD4としてあげればアクアマリンを表現できるかと思いました。

しかしこのColorDialogのCustomColorsプロパティの値に0xFF0000といれれば赤が出るはずなのに青がでました。調べてみたら以下のようになっていました。

RGBではなく、BGRでした。なのでColor構造体からBGRで色を抽出する関数(GetColorInt)を作成しました。

やっていることを図?(ひっ算?)にしてみました。

作成した色の保存について

自分で作成した色は、CustomColorsプロパティに入っています。中身はint配列なのであとはこれをどうやって保存しておくか?です。

方法としてxmlなどでファイル出力するか、レジストリに追加するか・・・。

結局は、あとでint配列で取得できる形として保存しておければよいかと思います。

まとめ

CustomColorsプロパティが少しややこしかったですが、色のダイアログを出すには便利なクラスです。

この記事が皆様のお役に立てたら幸いです。

コメント

タイトルとURLをコピーしました