Изменение цвета рамки 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();
}
}