[C#][Windows Formsアプリ][ColorDialog] Colorプロパティによる初期色設定と選択結果の扱い

スポンサーリンク

はじめに

本記事では、Windows Forms の ColorDialog における Color プロパティの使い方を、初心者にもわかるように解説します。Color は「初期表示の色の指定」と「ユーザーが選んだ最終的な色の取得」という2つの役割を担います。キーポイントは次の3点です。

・ダイアログ表示前に ColorDialog.Color に初期色を設定する
ShowDialog()DialogResult.OK のときだけ Color を読み取る
Color は不透明(A=255)で返るため、透過色は扱えない

説明

ColorDialog は Windows 標準の色選択ダイアログです。ColorDialog.Color は以下のように機能します。

1) 初期色の指定:ダイアログを開く前に dlg.ColorSystem.Drawing.Color を設定すると、その色が選択状態で表示されます。ユーザーはそこから微調整できます。

2) 結果の取得dlg.ShowDialog(owner) の戻り値が DialogResult.OK のとき、dlg.Color にユーザーが選んだ色が入っています。Cancel の場合は反映しないのが一般的です。

3) アルファ値についてColorDialog は RGB(24bit)を扱い、透過度(Alpha)は選べません。そのため dlg.Color.A は常に 255(不透明)です。透明度を扱いたい場合は別 UI(トラックバー等)を用意して ARGB を自前で合成します。

4) 名前と16進表記Color を UI 表示したい場合、R/G/B を使って #RRGGBB 形式に整形できます。既知色(KnownColor)のときは c.IsKnownColortrue になり、c.Name で色名(例:Red)が取得できます。既知色でない場合の c.NameffRRGGBB のような ARGB 文字列になる点に注意してください。

5) 関連オプション:初期色指定と併用することが多いのが FullOpen(起動直後からカスタム色領域を展開)と CustomColors(ユーザー定義色の配列)です。Color と合わせると、実用的な色選択体験になります。

サンプルコード

ボタンで ColorDialog を開き、Color プロパティで選んだ色をパネル背景に反映し、RGB と 16 進表記をラベルに表示するサンプルです。初期色には現在のパネル色を渡しています。

using System;
using System.Drawing;
using System.Windows.Forms;

namespace ColorDialogColorSample
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }

    public class MainForm : Form
    {
        private readonly Button btnPick;
        private readonly Panel previewPanel;
        private readonly Label lblInfo;

        public MainForm()
        {
            Text = "ColorDialog.Color の基本";
            Width = 460;
            Height = 260;
            StartPosition = FormStartPosition.CenterScreen;

            btnPick = new Button
            {
                Text = "色を選ぶ...",
                AutoSize = true,
                Location = new Point(20, 20)
            };
            btnPick.Click += OnPickColorClicked;

            previewPanel = new Panel
            {
                BorderStyle = BorderStyle.FixedSingle,
                BackColor = Color.SteelBlue,
                Location = new Point(20, 70),
                Size = new Size(400, 90)
            };

            lblInfo = new Label
            {
                AutoSize = true,
                Location = new Point(20, 170),
                Text = "RGB と HEX をここに表示します"
            };

            Controls.AddRange(new Control[] { btnPick, previewPanel, lblInfo });
        }

        private void OnPickColorClicked(object sender, EventArgs e)
        {
            using (var dlg = new ColorDialog())
            {
                // 1) 初期色:いまのプレビュー色をそのまま渡す
                dlg.Color = previewPanel.BackColor;
                // 任意:起動時からカスタム色領域を展開
                dlg.FullOpen = true;

                // 2) ダイアログをオーナー指定で開く
                var result = dlg.ShowDialog(this);
                if (result == DialogResult.OK)
                {
                    // 3) OK のときだけ結果色を取得して反映
                    var c = dlg.Color; // ここが本記事の主役
                    previewPanel.BackColor = c;

                    // 4) 表示用に RGB と 16進(#RRGGBB)を整形
                    string hex = $"#{c.R:X2}{c.G:X2}{c.B:X2}";
                    string name = c.IsKnownColor ? c.Name : "Custom";
                    lblInfo.Text = $"RGB: {c.R}, {c.G}, {c.B}   HEX: {hex}   Name: {name} (A={c.A})";
                }
                // Cancel のときは何もしない
            }
        }
    }
}

コード解説(押さえるべきポイント)

初期色の活用dlg.Color = previewPanel.BackColor; で、ユーザーは現在色から微調整できます。UX がぐっと良くなります。

結果の読み取りdlg.ShowDialog(this) の戻りが DialogResult.OK のときだけ dlg.Color を採用します。Cancel 時に反映すると混乱の元です。

HEX 表記$"#{c.R:X2}{c.G:X2}{c.B:X2}" で #RRGGBB を生成できます。Web カラーやログに便利です。

既知色の名前c.IsKnownColortrue の場合に限り c.Name は色名になります。未知色では ffRRGGBB のような ARGB 文字列になる点に注意。

アルファは常に 255ColorDialog は透明度を扱えないため、c.A は 255(不透明)で返ります。透過を使いたい画面では、別 UI を組み合わせましょう。

つまづきポイント

Cancel 時に色を反映してしまうOK 以外では適用しないこと。DialogResult.OK の明示チェックが大事です。

Alpha を期待するColorDialog は RGB 専用。A(透明度)は常に 255。半透明のプレビューが必要なら、トラックバー等で 0–255 を別管理して Color.FromArgb(a, r, g, b) を自作します。

Color.Name の誤解:既知色以外では人間が読める色名ではありません。UI 表示には #RRGGBB を併用するのが無難です。

オーナー未指定ShowDialog() にオーナーを渡さないとフォーカス問題が起きることがあります。ShowDialog(this) を基本に。

Dispose 忘れ:共通ダイアログはネイティブ資源を持つため using で確実に破棄しましょう。

まとめ

ColorDialog.Color は「初期色の提示」と「結果色の取得」という要に当たるプロパティです。ShowDialog() の戻り値チェック、#RRGGBB の整形、アルファ非対応の前提を押さえておけば、現場で迷いません。実装は短く、効果は大きい。まずは既存 UI に初期色指定と HEX 表示を足してみてください。

Please follow and like us:

コメント

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