[C#][Windows Formsアプリ][ColorDialog] AllowFullOpen と FullOpen 徹底解説:カスタム色の許可と起動時の展開をコントロールする

スポンサーリンク

はじめに

本記事では、Windows Forms の ColorDialog における AllowFullOpenFullOpen の2つのプロパティを中心に、色選択ダイアログの挙動をコントロールする方法を解説します。この記事でわかることは次のとおりです。

AllowFullOpenFullOpen の役割と違い(よく混同されます)
・既定値と、ユーザー体験を良くするための設定パターン
・実装サンプル(チェックボックスで挙動を切り替え、ShowDialog() で確認)

説明

用語の整理

AllowFullOpen:ユーザーが「色の作成(カスタム色)」領域を開けるかどうかを許可します。
true(既定):ユーザーはカスタム領域にアクセスできます。
false:カスタム領域を開くこと自体ができません(ボタンが無効/非活性)。

FullOpen:ダイアログを開いた直後から「カスタム色」領域を展開しておくかを指定します。
true:起動時にすでにカスタム領域が開いた状態で表示されます。
false(既定):通常表示(必要に応じてユーザーが開く)。

関係性

FullOpenAllowFullOpentrue のときにのみ意味を持ちます。AllowFullOpen = false だと、FullOpen = true にしてもカスタム領域は開けません(許可されていないため)。

おすすめの使い分け

・標準色だけ使わせたい:AllowFullOpen = falseFullOpen は無視される)
・とにかくすぐ微調整してほしい:AllowFullOpen = true かつ FullOpen = true
・通常は標準色、必要なら詳細設定:AllowFullOpen = trueFullOpen = false(既定)

サンプルコード

チェックボックスで AllowFullOpenFullOpen を切り替え、ボタンでダイアログを表示します。選んだ色はパネル背景に反映し、RGB/HEX 情報も表示します。

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

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

    public class MainForm : Form
    {
        private readonly CheckBox chkAllowFullOpen;
        private readonly CheckBox chkFullOpen;
        private readonly Button btnOpen;
        private readonly Panel preview;
        private readonly Label lblInfo;

        public MainForm()
        {
            Text = "ColorDialog: AllowFullOpen / FullOpen 実演";
            Width = 560;
            Height = 300;
            StartPosition = FormStartPosition.CenterScreen;

            chkAllowFullOpen = new CheckBox
            {
                Text = "AllowFullOpen(カスタム色へのアクセスを許可)",
                Checked = true,
                AutoSize = true,
                Location = new Point(20, 20)
            };

            chkFullOpen = new CheckBox
            {
                Text = "FullOpen(起動時からカスタム領域を展開)",
                Checked = true,
                AutoSize = true,
                Location = new Point(20, 50)
            };

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

            preview = new Panel
            {
                BorderStyle = BorderStyle.FixedSingle,
                BackColor = Color.CornflowerBlue,
                Location = new Point(20, 130),
                Size = new Size(500, 90)
            };

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

            Controls.AddRange(new Control[] { chkAllowFullOpen, chkFullOpen, btnOpen, preview, lblInfo });
        }

        private void OnOpenDialog(object sender, EventArgs e)
        {
            using (var dlg = new ColorDialog())
            {
                // 現在の色を初期色としてセット
                dlg.Color = preview.BackColor;

                // チェックボックスに応じて挙動を切り替え
                dlg.AllowFullOpen = chkAllowFullOpen.Checked; // カスタム領域にアクセス可能か
                dlg.FullOpen = chkFullOpen.Checked;            // 起動時にカスタム領域を展開するか

                // ※ AllowFullOpen=false の場合、FullOpen=true でも展開されません

                var result = dlg.ShowDialog(this);
                if (result == DialogResult.OK)
                {
                    var c = dlg.Color;
                    preview.BackColor = c;
                    string hex = $"#{c.R:X2}{c.G:X2}{c.B:X2}";
                    lblInfo.Text = $"RGB: {c.R}, {c.G}, {c.B}   HEX: {hex}   A={c.A}";
                }
            }
        }
    }
}

サンプルの見どころ

初期色の指定dlg.Color = preview.BackColor; として、直前の選択色から再開できるようにしています。
即カスタム表示FullOpentrue にすると、ダイアログ起動時点から詳細領域が開いた状態になります。
権限の有無AllowFullOpenfalse にすると、ユーザーはカスタム領域へアクセスできず、FullOpen の設定は無視されます。

つまづきポイント

FullOpen だけを true にして動かないAllowFullOpen=false だと FullOpen は効きません。まずは AllowFullOpen=true を確認。
既定値の取り違えAllowFullOpen は既定 true、FullOpen は既定 false。必要時のみ変更しましょう。
Cancel 時の誤適用ShowDialog() の戻り値が DialogResult.OK のときだけ色を反映。Cancel で色が変わるとユーザーは混乱します。
アルファ値の誤解ColorDialog は透明度を扱いません(常に A=255)。半透明を使いたい場合は別 UI を併用します。

まとめ

AllowFullOpen は「カスタム色へのアクセスの可否」、FullOpen は「ダイアログ起動直後の展開状態」を決めるフラグです。2つの役割を分けて考え、ニーズに合わせて組み合わせれば、ユーザーにとって分かりやすく効率的な色選択体験を提供できます。まずは、既存アプリに AllowFullOpen/FullOpen の設定を加えて、意図通りの UI になっているか確認してみましょう。

Please follow and like us:

コメント

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