Предотвращение мерцания при обработке WM_PAINT в C # - PullRequest
0 голосов
/ 04 июня 2018

В настоящее время я работаю над набором элементов пользовательского интерфейса, и 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, который мне не подходит.

Итак: есть ли способ убрать мерцание, не окрашивая весь элемент управления сам?

...