Изменение цвета рамки Combobox на фокусе

У меня есть обычай ComboBox,

Я хочу дать обычай BorderColor к ComboBoxкогда это сфокусировано.

Для этого я использую следующий код:

Graphics g = Graphics.FromHwnd(Handle);
Rectangle bounds = new Rectangle(0, 0, Width, Height);

ControlPaint.DrawBorder(g, bounds, BaseConfigurations.StyleColor, ButtonBorderStyle.Solid);

Дело в том, что если я использую код внутри MouseHover событие, когда я перемещаю мышь на ComboBox контроль, я вижу, что это работает. Тем не менее, тот же код не работает внутри GotFocus Событие, и я не могу понять, почему.. любая помощь приветствуется.

1 ответ

Это простой класс, который наследует от ComboBox и предоставляет два свойства, которые позволяют установить активную и неактивную границу элемента управления.

Картина выполнена с использованием родительской формы Paint() событие, лишающее законной силы только область вокруг выбранного элемента управления.

Родитель Paint() событие подписано в пользовательском ComboBox OnHandleCreated() событие, наряду с контролем Enter(), Leave() а также Move() События.
Подписка на Move() событие требуется для рисования прозрачной границы, в противном случае граница останется закрашенной в родительской клиентской области при перетаскивании элемента управления во время разработки.

Я также добавил DropDownBackColor() а также DropDownForeColor() свойства, которые становятся активными, если пользовательский ComboBox DrawMode установлен в OwnerDrawVariable (по-прежнему).

Вот как это выглядит:


public class CustomCombo : ComboBox
{
    private Color ActionBorderColor = Color.Empty;
    public CustomCombo()
    {
        InitializeComponent();
    }

    public Color BorderActive { get; set; }
    public Color BorderInactive { get; set; }
    public Color DropDownBackColor { get; set; }
    public Color DropDownForeColor { get; set; }

    private void InitializeComponent()
    {
        this.DrawMode = DrawMode.OwnerDrawVariable;
        this.BorderActive = Color.OrangeRed;
        this.BorderInactive = Color.Transparent;
        this.DropDownBackColor = Color.FromKnownColor(KnownColor.Window);
        this.DropDownForeColor = this.ForeColor;
        this.HandleCreated += new EventHandler(this.OnControlHandle);
    }

    protected void OnControlHandle(object sender, EventArgs args)
    {
        Form parent = this.FindForm();
        parent.Paint += new PaintEventHandler(this.ParentPaint);
        this.Enter += (s, ev) => { this.InvalidateParent(BorderActive); };
        this.Leave += (s, ev) => { this.InvalidateParent(BorderInactive); };
        this.Move += (s, ev) => { this.InvalidateParent(Color.Transparent); };
        base.OnHandleCreated(e);
    }

    private void InvalidateParent(Color bordercolor)
    {
        ActionBorderColor = bordercolor;
        Rectangle rect = this.Bounds;
        rect.Inflate(2, 2);
        this.FindForm().Invalidate(rect);
    }

    protected void ParentPaint(object sender, PaintEventArgs e)
    {
        Rectangle rect = this.Bounds;
        rect.Inflate(1, 1);
        using (Pen pen = new Pen(ActionBorderColor, 1))
            e.Graphics.DrawRectangle(pen, rect);
    }

    protected override void OnDrawItem(DrawItemEventArgs e)
    {
        using (SolidBrush bkBrush = new SolidBrush(this.DropDownBackColor))
            e.Graphics.FillRectangle(bkBrush, e.Bounds);
        using (SolidBrush foreBbrush = new SolidBrush(this.DropDownForeColor))
            e.Graphics.DrawString(this.Items[e.Index].ToString(),
                                  this.Font, foreBbrush, new PointF(e.Bounds.X, e.Bounds.Y));
        e.DrawFocusRectangle();
    }
}
Другие вопросы по тегам