В настоящее время я работаю над набором элементов пользовательского интерфейса, и ComboBox доставляет мне неприятности.
Моя цель - нарисовать границу в 1 пиксель вокруг элемента, которая изменит цвет при наведении курсора мыши на него..
Я использовал метод WndProc()
, чтобы отреагировать на сообщение WM_PAINT
и нарисовать границу:
protected override void WndProc(ref Message m)
{
if (m.Msg == (int)WindowsMessages.Win32Messages.WM_PAINT)
{
base.WndProc(ref m);
if (hovered || Focused)
{
//Paint frame with hovered color when being hovered over
PaintHelper.PaintFrame(this, _frameColorHovered, _frameWidth);
}
else
{
//Paint frame with standart color
PaintHelper.PaintFrame(this, _frameColor, _frameWidth);
}
}
.
.
.
}
Вспомогательный метод рисования выглядит следующим образом:
public static void PaintFrame(Control target, Color color, int frameWidth)
{
IntPtr dc = GetWindowDC(target.Handle);
using (Graphics g = Graphics.FromHdc(dc))
{
using (Pen p = new Pen(color, frameWidth))
g.DrawRectangle(p, frameWidth / 2, frameWidth / 2, target.Width - frameWidth, target.Height - frameWidth);
}
}
Пока все хорошо, но граница продолжает мерцать, когда мышь выходит за пределы границ Элементов!Я провел некоторое исследование, но все используют флаг UserPaint
, который мне не подходит.
Итак: есть ли способ убрать мерцание, не окрашивая весь элемент управления сам?