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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das ist der Fehler. Doppel-Pufferung kann nur funktionieren, wenn Sie ziehen in den Puffer. Der, - e.Grafik Referenzen. Update:
Beachten Sie, dass Panel nicht double-buffering standardmäßig aktiviert. Sie benötigen zur Ableitung Ihrer eigenen. Fügen Sie diesen in eine neue Klasse:
Kompilieren. Es fallen von der Spitze der toolbox.
BufferedPanel
Klasse. Ich kenne mindestens zwei Programmierer, die geschrieben haben genau den gleichen code unabhängig. Dies sollte wirklich Rahmen.Ich persönlich nicht die Mühe mit dem DoubleBuffered Einstellung. Ich habe gerade alles zeichnen in ein bitmap und dann im paint-Ereignis zeichnen, die bitmap auf dem Bildschirm.