Flackern in Form



  • Hallo,

    ich versuche mit dem Compact Framework einen kleinen Mp3 Player für den Pocket PC zu schreiben. Der Player zeigt alle Tracks auf einer Liste an ( http://img519.imageshack.us/my.php?image=playersq7.jpg ).
    Um die Liste darzustellen erstelle ich ein Bitmap (das die ganze Playlist beinhaltet), hole mir daraus ein Graphics Object und auf diese Graphics-Referenz führe ich dann alle Zeichenoperationen aus. So zeichne ich z.B. beim Initialisieren im Konstruktor die Liste (die Tracknamen und die Trennstriche):

    playlistBitmap = new Bitmap(ClientSize.Width, playlistHeight);
    graphics = Graphics.FromImage(playlistBitmap);
    graphics.FillRectangle(new SolidBrush(backgroundColor), 0, 0, playlistBitmap.Width, playlistBitmap.Height);
    
    for (int i = 0; i < files.Length; i++) {
       graphics.DrawString(Path.GetFileNameWithoutExtension(files[i]), font, new    SolidBrush(Color.Black), 5, i * 20);
       graphics.DrawLine(new Pen(Color.LightSlateGray), 0, (i + 1) * trackHeight - 1, ClientSize.Width, (i + 1) * 20 - 1);
    }
    

    Um die Änderungen dann sichtbar zu machen (graphics is ja einfach nur das bitmap), überschreibe ich onPaint und kopiere den aktuell sichtbaren Bereich des bitmap in das graphics der form:

    protected override void OnPaint(PaintEventArgs e) {
       /* hier stehen noch ein paar Zeichenoperationen auf das Bitmap */
       // Jetzt das Bitmap auf die Form kopieren:
       Graphics g = this.CreateGraphics();
       g.DrawImage(playlistBitmap, new Rectangle(0, 0, ClientSize.Width,  ClientSize.Height), visibleSection, GraphicsUnit.Pixel);
    }
    

    Das funktioniert alles auch ganz gut, nur leider flackert es ziemlich heftig. Und das, obwohl ich ja garnicht direkt auf das graphics der form zeichne, sondern erst auf mein offscreen bitmap und erst am ende alles in die form kopiere. allerdings rufe ich in meinem code an relativ vielen stellen Invalidate() auf, was ja ein neuzeichnen bewirkt. Könnte es daran liegen? Falls ja: wie kann ich meinen Code ändenr, so dass es nicht mehr flackert?

    Danke!



  • protected override void OnPaint(PaintEventArgs e) {
       /* hier stehen noch ein paar Zeichenoperationen auf das Bitmap */
       // Jetzt das Bitmap auf die Form kopieren:
       Graphics g = this.CreateGraphics();
       g.DrawImage(playlistBitmap, new Rectangle(0, 0, ClientSize.Width,   ClientSize.Height), visibleSection, GraphicsUnit.Pixel);
    }
    

    Eine Sache fällt mir da auf. In den PaintEventArgs ist bereist ein apssenden Graphics Object, trotzdem erzeugst Du jedesmal ein Neues (this.CreateGraphics)

    Du koenntest auch einfach

    e.Graphics.
    

    benutzen. Aber ka ob das aufs Flackern eien Auswirkung hat.


Anmelden zum Antworten