Entwickler-Ecke

Multimedia / Grafik - Doublebuffering?


AXMD - So 02.04.06 11:12
Titel: Doublebuffering?
Morgen :)

Hab grade eben versucht, ein Pendant für das Canvas unter Win32 gefunden und bin da auf das ganze Graphics-Zeug gestoßen... nett, was man damit alles machen kann, wenn man weiß wie. Was ich allerdings nicht gefunden habe (wahrscheinlich mangels richtiger Stichwörter bei der Suche) ist ein Pendant zum DoubleBuffering in Win32. Die Anzeige flackert ziemlich bei folgendem Code - gibt's irgendeine Eigenschaft (von Graphics oder sonstwas), die man setzen kann, um das Flackern zu unterbinden?


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
    private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {
      //Zeichnen...
      Graphics g = panel1.CreateGraphics();
      g.Clear(Color.White);
      if (checkBox1.Checked)
        g.SmoothingMode = SmoothingMode.HighQuality; //AntiAlias
      else
        g.SmoothingMode = SmoothingMode.None;
      Pen p = new Pen(Color.Black, 1);
      Pen p2 = new Pen(Color.Red, 1);
      g.DrawLine(p, panel1.Width / 20, panel1.Width / 2, panel1.Height);
      g.DrawLine(p, 0, panel1.Height / 2, panel1.Width, panel1.Height / 2);
      g.DrawEllipse(p2, panel1.Width / 4, panel1.Height / 4, panel1.Width / 2, panel1.Height / 2);
      if (checkBox1.Checked)
        g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
      else
        g.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;
      g.DrawString("Test"new Font("Verdana"16), new SolidBrush(Color.Black), 1010);

    }


AXMD


Kha - So 02.04.06 12:18

Hab von GDI+ zwar noch nicht wirklich Ahnung, aber es wird wohl auf das gleiche wie bei TCanvas hinauslaufen:
Zeichne nie direkt auf ein Control :wink: .


AXMD - So 02.04.06 12:22

user profile iconKhabarakh hat folgendes geschrieben:
Hab von GDI+ zwar noch nicht wirklich Ahnung, aber es wird wohl auf das gleiche wie bei TCanvas hinauslaufen:
Zeichne nie direkt auf ein Control :wink: .


Die Frage ist nur, wie sonst darauf zeichnen ;)

AXMD


Kha - So 02.04.06 12:28

Auf irgendetwas Unsichtbares, mit der VCL wäre das TBitmap.
Schau mal bei Codeproject.com nach Double Buffering, da sollte sich Einiges finden lassen.
Als Notlösung gäbe es noch ControlStyles.DoubleBuffered, aber naja...


Codeexplorer - Mo 09.07.07 16:28
Titel: Tipps und Fragen
:D Hallo Grafikprogrammierer,

ich stehe gerade vor einer ähnlichen Problemstellung wie oben beschrieben.
Außer beim CodeProject "Don't Flicker! Double Buffer!" findet man auch
in der Hilfe unter "Doppelt gepufferte Grafiken" ganz gute Infos.

In einem Punkt bin ich mir aber noch nicht ganz schlüssig:
Auf welchem Hintergrund sollte man denn nun idealerweise Grafiken darstellen?
Ich hatte erst mal an ein Panel gedacht, aber warum ist das double buffering
dort nicht so einfach möglich? (man muss zuerst eine Klasse von Panel
ableiten um an den protected member SetStyle ranzukommen...).
Weiter geht's dann mit den Klassen BufferedGraphicsContext und BufferedGraphics...