Я использовал двойную буферизацию для некоторых элементов управления .NET Compact Framework, которые полностью создаются пользователем, но мне трудно понять, как я могу использовать двойную буферизацию для элемента управления, который наследуется от другого элемента управления и закрашивает его.
У меня есть элемент управления на основе DataGrid, который закрашивает заголовки.
Мой метод OnPaint:
Protected Overrides Sub OnPaint(ByVal pe as System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(pe)
CustomPaintHeaders(pe.Graphics)
End Sub
CustomPaintHeaders просто рисует поверх основных заголовков DataGrid с некоторым настраиваемым рисунком. Иногда я начинаю мерцать, когда вижу, что основные заголовки DataGrid отрисовываются, но без моих настраиваемых элементов наверху.
Можно ли использовать двойную буферизацию и применить рисование, выполненное MyBase.OnPaint к изображению в буфере?
Изменить: как упоминалось в моем комментарии, я могу выполнять двойную буферизацию, используя этот код:
Protected Overrides Sub OnPaint(ByVal pe as System.Windows.Forms.PaintEventArgs)
Using currentRender as Bitmap = New Bitmap(Me.Width, Me.Height)
Using gr as Graphics = Graphics.FromImage(currentRender)
CustomPaintHeaders(gr)
CustomPaintRows(gr)
End Using
End Using
End Sub
Private Sub CustomPaintHeaders(ByVal graphics as Graphics)
'Custom drawing stuff in place of DataGrid column headers
End Sub
'TEMP - draws rectangle in place of grid rows
Private Sub CustomPaintRows(ByVal graphics as Graphics)
graphics.DrawRectangle(New Pen(Me.ForeColor), 0, 20, Me.Width, Me.Height)
End Sub
И это отлично работает без мерцания, но я бы хотел избежать реализации CustomPaintRows и просто позволить DataGrid OnPaint обрабатывать эту часть за меня, а затем рисовать поверх ее заголовков с помощью моего метода CustomPaintHeaders.