はじめに
本記事では、Windows Forms の ColorDialog における Color プロパティの使い方を、初心者にもわかるように解説します。Color は「初期表示の色の指定」と「ユーザーが選んだ最終的な色の取得」という2つの役割を担います。キーポイントは次の3点です。
・ダイアログ表示前に ColorDialog.Color に初期色を設定する
・ShowDialog() が DialogResult.OK のときだけ Color を読み取る
・Color は不透明(A=255)で返るため、透過色は扱えない
説明
ColorDialog は Windows 標準の色選択ダイアログです。ColorDialog.Color は以下のように機能します。
1) 初期色の指定:ダイアログを開く前に dlg.Color に System.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.IsKnownColor が true になり、c.Name で色名(例:Red)が取得できます。既知色でない場合の c.Name は ffRRGGBB のような 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.IsKnownColor が true の場合に限り c.Name は色名になります。未知色では ffRRGGBB のような ARGB 文字列になる点に注意。
・アルファは常に 255:ColorDialog は透明度を扱えないため、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 表示を足してみてください。

コメント