【C#/WinForms】カラーを選択するコンボボックスを作成する方法

C#
この記事は約5分で読めます。

コンボボックスに Color 構造体の141色を表示する方法です。オーナードローで描画しています。Color 構造体の一覧(パブリックな静的プロパティ)は GetProperties メソッドを使って取得しています。

イメージ

デフォルトの選択色は黒色です。選択した色は SelectedColor プロパティで取得可能です。

サンプルソース

ColorComboBox.cs

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;

namespace Test {
    /// <summary>
    /// カラーコンボボックス
    /// </summary>
    public class ColorComboBox : ComboBox {
        private Color selectedColor;
        /// <summary>        
        /// コンストラクタ
        /// </summary>        
        public ColorComboBox() : base() {
            this.DrawMode = DrawMode.OwnerDrawFixed;
            this.DropDownStyle = ComboBoxStyle.DropDownList;

            // リストを設定する
            PropertyInfo[] info = typeof(Color).GetProperties(BindingFlags.Public | BindingFlags.Static);
            for (int i = 0; i < info.Length; ++i) {
                this.Items.Add((Color)info[i].GetValue(null, null));
            }
            // 初期値は黒色
            this.SelectedColor = Color.Black;
        }

        [DefaultValue(typeof(Color), "Black")]
        [Browsable(true)]
        public Color SelectedColor {
            get {
                return this.selectedColor;
            }
            set {
                this.selectedColor = value;

                for (int i = 0; i < this.Items.Count; ++i) {
                    if ((Color)this.Items[i] == value) {
                        this.SelectedIndex = i;
                        break;
                    }
                }
            }
        }

        /// <summary>
        /// OnSelectedIndexChanged
        /// </summary>
        protected override void OnSelectedIndexChanged(EventArgs e) {
            this.selectedColor = (Color)this.SelectedItem;
            base.OnSelectedIndexChanged(e);
        }

        /// <summary>
        /// OnDrawItem
        /// </summary>
        protected override void OnDrawItem(DrawItemEventArgs e) {
            if (e.Index == -1) return;

            e.DrawBackground();
            // フォーカスの線は描画しない
            //e.DrawFocusRectangle();

            Rectangle rect = e.Bounds;
            Color color = (Color)this.Items[e.Index];
            rect.Offset(2, 2);
            rect.Width = 20;
            rect.Height -= 4;

            // 色を塗る
            e.Graphics.FillRectangle(new SolidBrush(color), rect);
            // 枠を描画
            e.Graphics.DrawRectangle(new Pen(e.ForeColor), rect);
            // 色名を描画
            e.Graphics.DrawString(color.Name, Font, new SolidBrush(e.ForeColor), e.Bounds.X + 30, e.Bounds.Y + 1);
            base.OnDrawItem(e);
        }
    }
}

補足

Color 構造体以外にも下記のようにシステムカラーの一覧を取得することも可能です。

PropertyInfo[] info = typeof(SystemBrushes).GetProperties(BindingFlags.Public | BindingFlags.Static);

おわりに

このコンボボックスは自作エディタの文字色選択で利用しています。

コメント

  1. エノキ より:

    情報ありがとうございます。

    for文で「<」と表示されておりますが、「<」のことでしょうか?

  2. エノキ より:

    「<」が「&lt」と表示していることをお伝えしたかったのです。

  3. TZ TZ より:

    ご指摘ありがとうございます。
    修正いたしました。

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