问题
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