Winforms мерцает при рисовании изображения на панели задач

Прямо сейчас я рисую маленькое изображение 16x16 в строке заголовка моего окна. Работает хорошо, за исключением неприятного мерцания, от которого я не могу понять, как избавиться.

Я просто рисую изображение следующим образом:

Protected Overrides Sub WndProc(ByRef m As Message)
    If m.Msg = WM_SIZE Then
        wnd_size = New Size(New Point(CInt(m.LParam)))
    End If
    If m.Msg = WM_ACTIVATE _
    OrElse m.Msg = WM_SIZE _
    OrElse m.Msg = WM_SYNCPAINT _
    OrElse m.Msg = WM_NCACTIVATE _
    OrElse m.Msg = WM_NCCREATE _
    OrElse m.Msg = WM_NCPAINT _
    OrElse m.Msg = WM_NCACTIVATE _
    OrElse m.Msg = WM_NCHITTEST _
    OrElse m.Msg = WM_PAINT _
    OrElse m.Msg = WM_MOUSEMOVE Then
        Dim g As Graphics = Graphics.FromHdc(CType(GetWindowDC(CInt(Handle)), IntPtr))
        g.DrawImage(My.Resources.drag, 0, 0, 16, 16)
    End If
    MyBase.WndProc(m)
End Sub

Он перерисовывает всю строку заголовка каждый раз, когда на ней что-то изменяется (щелчок, наведение курсора на угловые кнопки и т. д.), и во время перерисовки я получаю мерцание.

Кто-нибудь еще сталкивался с этой проблемой?


person instantmusic    schedule 08.09.2010    source источник


Ответы (1)


В свете предыдущих комментариев по этому поводу я решил, что на самом деле не стоит этого делать. Эффект мерцания не исчезнет, ​​если я полностью не нарисую строку заголовка вручную, что является неуклюжим обходным путем. Вместо этого я переосмыслил свое представление о том, как работать с программой в целом. Единственным жизнеспособным решением является полное удаление границы окна и рисование псевдограницы/полосы поверх формы. См. http://www.codeproject.com/KB/miscctrl/gTitleBar.aspx

Или еще лучше, просто пусть будет строка заголовка.

person instantmusic    schedule 22.09.2010