Changing the border color of a Combobox on focus

∥☆過路亽.° 提交于 2019-12-01 08:09:11

问题


I have a custom ComboBox.

I want to give a custom BorderColor to the ComboBox, when it is focused.

To do this, I'm using the following code:

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

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

The thing is, if I use the code inside the MouseHover event when I move the mouse on the ComboBox control, I can see that it works. However, the same code does not work inside the GotFocus Event, and I can't figure out why.. any help is appreciated.


回答1:


This is a simple Class that inherits from ComboBox and exposes two properties that allows to set the Active and Inactive border of the Control.

The painting is done using the Parent Form Paint() event, invalidating only the area around the selected control.

The Parent Paint() event is subscribed in the custom ComboBox OnHandleCreated() event, along with the control's Enter(), Leave() and Move() events.
Subscribing the Move() event is required to paint a transparent border, otherwise the border will remain painted on the Parent client area while dragging the control at Design time.

I've also added DropDownBackColor() and DropDownForeColor() properties, which become active if the custom ComboBox DrawMode is set to OwnerDrawVariable (as usual).

This is how it looks like:


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();
    }
}


来源:https://stackoverflow.com/questions/49302435/changing-the-border-color-of-a-combobox-on-focus

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!