Я пытался реализовать пользовательскую двойную буферизацию, но она вызывает мерцание.
Это код в конструкторе управления (настраиваемый элемент управления, наследуемый от Control):
bufferContext = new BufferedGraphicsContext();
SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
SetStyle(ControlStyles.DoubleBuffer, false);
SetStyle(ControlStyles.ResizeRedraw, false);
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
SetStyle(ControlStyles.Opaque, true);
Событие OnPaint:
protected override void OnPaint(PaintEventArgs e)
{
if (buffer == null)
{
Draw(e);
return;
}
if (Repaint)
{
Repaint = false;
PaintEventArgs pe = new PaintEventArgs(buffer.Graphics, e.ClipRectangle);
Draw(pe);
}
buffer.Render(e.Graphics);
}
Также этот код активируется при изменении размера, связанном с буферизацией:
Graphics g = this.CreateGraphics();
if (buffer != null)
{
buffer.Dispose();
buffer = null;
}
if (!(bufferContext == null || DisplayRectangle.Width <= 0 || DisplayRectangle.Height <= 0))
{
buffer = bufferContext.Allocate(g, DisplayRectangle);
Repaint = true;
}
Метод Draw сложен, но он сначала заполняет элемент BackColor, остальное не имеет значения.
Я могу заметить своими глазами, что иногда возникает мерцание, в основном при изменении размера окна. Насколько я понимаю, черный цвет закрашивается сначала над управлением, а затем над графикой из буфера, что вызывает мерцание. Однако BackColor никогда не бывает черным.
Что делать, чтобы остановить это?