Graphics DrawLine Doubelbufferd



  • Hallo,

    ich habe auf einem Formular ein Graphics Object erstellt und
    zeichne mit DrawLine eine Linie dessen Position sich alle 10ms (Timer)
    ändert.

    Das ganze flackert nun aber, Form1.Doublebuffered hilft nicht.

    Das Graphics object hat kein Doublebufferd, was muss ich tun?

    Gruß
    Johann



  • Alles erst in eine Bitmap zeichnen und dann die Bitmap in einem Rutsch auf die Form zeichnen



  • hast userpaint auch mit in setstyle gepackt?



  • Also aus meiner Erfahrung flackert das im Paint-Event überhaubt nicht. Aber ist jetzt nur meine Erfahrung...



  • hermes schrieb:

    alle 10ms (Timer)

    Das entspricht einer Bildwiederholrate von 100 Hz. Mal davon ausgehend das Dein Bildschirm nur mit 60Hz gezeichnet wird kann das schon zu "Flackern" führen. In der Regel macht es keinen Sinn irgendwas öfter zu zeichnen als die Bildwiederholrate...



  • Hallo zusammen,

    ein Windows-Timer hat sowieso nur eine minimale Intervallgrenze von 14-15ms, d.h. max. 70 Hertz.

    Auf XP-Rechnern kann es bei schnellen Änderungen noch zu einem Flackern kommen (trotz DoubleBuffering), unter Vista und Win7 jedoch wird intern beim Blitten immer ein DoubleBuffering durchgeführt (Aero ist ja DirectX-basiert).



  • thefiloe schrieb:

    Also aus meiner Erfahrung flackert das im Paint-Event überhaubt nicht. Aber ist jetzt nur meine Erfahrung...

    also alles ins paint event rein und im timer mit this.Invalidate(); neu zeichnen lassen :p

    EDIT:::

    SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
    

    damit flackert bei mir nie was, egal wieviel gezeichnet wird..

    allerdings musst halt selber klassen schreiben und die dann von UserControl erben lassen. zumindest mach ich das immer so. dann klappts auch mitm nachbarn^^


  • Administrator

    geeky schrieb:

    Alles erst in eine Bitmap zeichnen und dann die Bitmap in einem Rutsch auf die Form zeichnen

    QFT

    Und falls dies nicht reicht, kann man noch OnPaintBackground überschreiben und dabei die Basismethode nicht aufrufen. Also grundsätzlich einfach nichts machen in der Methode.

    Grüssli


Anmelden zum Antworten