AdSense

Freitag, 14. Juni 2013

C# Windows Forms - DoubleBuffer zeichnen

(English version) Für Panzerkampf muss ich ja die Panzer und alles zeichnen. Da Windows Forms grundsätzlich mal alles löscht und dann neu zeichnet, kann es zu starkem Flackern führen. Um das zu verhindern, lasse ich im Hintergrund immer alles in ein Bitmap zeichnen und zeichne das dann auf die aktuelle Ebene - welche ich nicht lösche. Dadurch ist das Problem mit dem Flackern komplett behoben. Hier der Code dazu:

void drawDoubleBufBmp()
{
    Bitmap localBitmap = new Bitmap(settings.SizeX, settings.SizeY);
    using (Graphics gx = Graphics.FromImage(localBitmap))
    {
        gx.DrawDrawString("Panz.....");
    }
    lock (BmpLock)
    {
        doubleBufBmp = localBitmap;
    }
}


private Bitmap doubleBufBmp = new Bitmap(settings.SizeX, settings.SizeY);
private object BmpLock = new object();
protected override void OnPaint(PaintEventArgs e)
{
    lock (BmpLock)
    {
        g.DrawImage(doubleBufBmp, 0, 0);
    }
}

protected override void OnPaintBackground(PaintEventArgs e)
{}


OnPaintBackground habe ich einfach überschrieben, dies hat zu dem Flackern geführt. In der OnPaint Funktion male ich dann einfach das fertige doubleBufBmp in das Fenster rein. drawDoubleBufBmp() wird bei mir von einem Thread alle 10 Millisekunden aufgerufen, welcher danach this.Invalidate(); aufruft, was dafür sorgt, dass die OnPaint-Funktion aufgerufen wird.

Keine Kommentare:

Kommentar veröffentlichen