C# ComboBoxにBorder/BorderStyle属性をつける


概要

C#でWindowsApplicationを作っていた時、

全体的なデザインをFLATにしてたら

ComboBoxの外枠線が白で、境界が見えにくくなった。

Borderを変えようとしたら、ComboBoxには標準ではついてないのね。

自分で作るか。

実装

ComboBoxを継承したカスタムComboBoxを作る。

サンプルではComboBoxExという名前で作ってます。

んで、WndProcを拾ってPaintしてやる感じに。

サンプルはこんな感じ。

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Data;
using System.ComponentModel;

namespace hoge
{
    /// <summary>
    /// ComboBoxEx
    /// </summary>
    public class ComboBoxEx : ComboBox
    {
        #region ComboBoxのBorderColor/BorderStyle実装

        private Color _borderColor = Color.Silver;
        private ButtonBorderStyle _borderStyle = ButtonBorderStyle.None;
        private static int WM_PAINT = 0x000F;

        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);

            if (m.Msg == WM_PAINT)
            {
                Graphics g = Graphics.FromHwnd(Handle);
                Rectangle bounds = new Rectangle(0, 0, Width, Height);
                ControlPaint.DrawBorder(g, bounds, _borderColor, _borderStyle);
            }
        }

        [Category("Appearance")]
        public Color BorderColor
        {
            get { return _borderColor; }
            set
            {
                _borderColor = value;
                Invalidate();
            }
        }

        [Category("Appearance")]
        public ButtonBorderStyle BorderStyle
        {
            get { return _borderStyle; }
            set
            {
                _borderStyle = value;
                Invalidate();
            }
        }

        #endregion
    }
}

 

にしてもなぜ標準でついてないのかね。

ComboBoxってSelectedIndexChangedイベントとかの

動作もおかしかったような気がする。

しかも結構昔から。

みんなカスタムコントロール前提になってるけど標準でどうにかしてほしいな。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です