Doppelte Pufferung, wenn Sie nicht zeichnen in OnPaint(): warum geht es nicht?

Arbeite ich auf eine einfache Vektor-Zeichnung app in C#/.Net. Die Zeichnung erfolgt in einem panel, aber ich bin nicht mit der OnPaint () - Ereignis für alle, die es - in der Tat die OnPaint() selbst ruft nur eine andere Methode, die tatsächlich zieht alles in das Dokument.

Habe ich versucht, hinzuzufügen double buffering, aber wenn ich DoubleBuffered auf true, das flackern-Problem ist noch schlimmer. Warum ist das so? Wenn ich will, um Doppel-Puffer der Steuerung, muss ich unbedingt haben, alles zu tun, meine Zeichnung in der OnPaint () - Ereignis, mit dem mitgelieferten Graphics-Objekt, anstatt Panel.CreateGraphics() und dann die Zeichnung dazu?

EDIT: Das ist der basic-code, den ich verwende.

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(((A.X + Offset.X) * ScaleFactor), ((A.Y + Offset.Y) * ScaleFactor));
    PointF PB = new PointF(((B.X + Offset.X) * ScaleFactor), ((B.Y + Offset.Y) * ScaleFactor));
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
    g.DrawLine(p, PA, PB);
}

Die Allgemeine Idee ist, dass die zwei Variablen, ScaleFactor-und Offset-finden Sie die zoom-level-und pan-Ebene in der Benutzeroberfläche. g ist ein Graphics-Objekt.

  • Kannst du den code in Ihrem panel die paint-event-handler und was auch immer Funktionen, die es fordert?
  • Ja, anstatt ein global Graphics-Objekt, ein globales bitmap. Auch, wenn Sie haben, PaintEventArgs e, die Sie nicht haben, zu sagen, "doc.CreateGraphics();" kann man nur sagen "e.Grafik;"
  • Wenn Sie nichts dagegen haben eine ummanaged Lösung schau mal hier: stackoverflow.com/questions/2682025/... (die akzeptierte Antwort), Dass oft für mich gearbeitet.
InformationsquelleAutor ian93 | 2010-06-24
Schreibe einen Kommentar