Text flackerfrei zeichnen



  • Hallo Forum,

    folgendes Problem: Ich hab' eine Arraylist mit einzlenen Textzeilen. Diese
    Textzeilen möchte ich gerne in ein Usercontrol darstellen.

    Bisher habe ich mit einer for-Schleife und "DrawString()" die einzelnen Zeilen bei jedem Paintereignis neu gezeichnet (was nicht sehr toll ist -> flackern 😞 ).

    Wie kann ich das wesentlich performanter lösen?

    Problem dabei ist, das es mehr Zeilen gibt als wie aktuell angezeigt werden können. D.h. es gibt eine Scrollleiste, mit der man den Text scrollen kann.

    Vielen Dank im voraus für Eure Hilfe,
    Stefan



  • Versuch mal in den Constructor des UserControls zu packen:

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


  • Das hat leider nischts gebracht. Hat die Sache eher noch verschlimmert, da teilweise bestimmte Bereiche nicht neu gezeichnet werden. (z.B. von aufgeklappten Menü oder Dialog- und Messageboxen)

    Trotzdem vielen Dank für Deine Bemühungen.

    Irgendwie muss das doch hinzubiegen zu sein, ich mein' bei Word flackert ja auch nischt wenn man mal ein bisschen hin- und herscrollt!

    --- Stefan ---



  • Das hat leider nischts gebracht. Hat die Sache eher noch verschlimmert, da teilweise bestimmte Bereiche nicht neu gezeichnet werden. (z.B. von aufgeklappten Menü oder Dialog- und Messageboxen)

    Trotzdem vielen Dank für Deine Bemühungen.

    Irgendwie muss das doch hinzubiegen zu sein, ich mein' bei Word flackert ja auch nischt wenn man mal ein bisschen hin- und herscrollt!

    --- Stefan ---



  • Das hat leider nischts gebracht. Hat die Sache eher noch verschlimmert, da teilweise bestimmte Bereiche nicht neu gezeichnet werden. (z.B. von aufgeklappten Menü oder Dialog- und Messageboxen)

    Trotzdem vielen Dank für Deine Bemühungen.

    Irgendwie muss das doch hinzubiegen zu sein, ich mein' bei Word flackert ja auch nischt wenn man mal ein bisschen hin- und herscrollt!

    --- Stefan ---



  • Suchbegriffe für Google:

    C# draw flicker

    C# draw doublebuffer





  • Hallo,
    vielen Dank für Eure schnellen Antworten.
    Leider waren die bisherigen Resultate nicht sehr befriedigend.

    Hab' mich jetzt zu einen vielleicht eher unkonventionellen Weg entschlossen:
    Erzeuge mit Bitmap ein Bild in dem ich die Zeichenmethoden anwende und dieses
    Bild zeige ich dann in einer Picturebox

    public void drawBox()
      {  
        Bitmap bm = new Bitmap((int)this.maxLengthOfStrings, (int)this.Font.GetHeight() * MAX_LINES);
        Graphics g = Graphics.FromImage(bm);
    
        //...
        // diverse Zeichenmethoden
        //...
    
        this.picLines.Image = bm;
      }
    

    Funktioniert ganz gut 😃

    Was haltet ihr von dieser Vorgehensweise?

    Stefan



  • Ja, das ist gut, denn das ist genau die Art und Weise, wie Double-Buffering funktioniert.


Anmelden zum Antworten