Double Buffering cuando no se dibuja OnPaint (): ¿por qué no funciona?

Estoy trabajando en una aplicación de dibujo vectorial simple en C # /. Net. El dibujo se hace en un panel, pero no estoy usando el evento OnPaint () para todo, de hecho, el OnPaint () incluso llama a otro método que realmente dibuja todo en el documento.

Traté de agregar doble búfer, pero cuando establecí DoubleBuffered en verdadero, el problema de parpadeo es aún peor. ¿Por qué es esto? Si quiero duplicar el buffer del control, ¿tengo que hacer absolutamente todo mi dibujo en el evento OnPaint (), con el objeto Graphics suministrado, en lugar de usar Panel.CreateGraphics () y luego dibujar en ese?

EDITAR: Este es el código básico que estoy usando.

private void doc_Paint(object sender, PaintEventArgs e) { g = doc.CreateGraphics(); Render(ScaleFactor, Offset); } private void Render(float ScaleFactor, PointF offset) { foreach (Line X in Document.Lines) { DrawLine(X.PointA, X.PointB, X.Color, X.LineWidth); } } private void DrawLine(PointF A, PointF B, Color Color, float Width) { Pen p = new Pen(Color, Width); PointF PA = new PointF(((AX + Offset.X) * ScaleFactor), ((AY + Offset.Y) * ScaleFactor)); PointF PB = new PointF(((BX + Offset.X) * ScaleFactor), ((BY + Offset.Y) * ScaleFactor)); g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; g.DrawLine(p, PA, PB); } 

La idea general es que las dos variables, ScaleFactor y Offset, se refieren al nivel de zoom y al nivel de outlook en la UI. g es un objeto Graphics.

 g = doc.CreateGraphics(); 

Ese es el error. El búfer doble solo puede funcionar si dibujas en el búfer. El que e.Graphics hace referencia. Fijar:

 g = e.Graphics; 

Tenga en cuenta que el Panel no tiene activado el doble búfer por defecto. Tendrás que derivar el tuyo. Pegar esto en una nueva clase:

 using System; using System.Windows.Forms; class BufferedPanel : Panel { public BufferedPanel() { this.DoubleBuffered = true; this.ResizeRedraw = true; } } 

Comstackr. Suelta de la parte superior de la caja de herramientas.

Personalmente, no me molesto con la configuración DoubleBuffered. Simplemente dibujé todo en un bitmap y luego en el evento de pintura dibujé ese bitmap en la pantalla.

 Bitmap BackBuffer; private void MainFormSplitContainerPanel1Paint(object sender, PaintEventArgs e) { e.Graphics.Clear(MainFormSplitContainer.Panel1.BackColor); if (BackBuffer != null) e.Graphics.DrawImage(BackBuffer, positionX, positionY, SizeX, SizeY); }