Flackerndes CEdit



  • Hallo,

    ich möchte sehr viele Daten in einem mehrzeiligen Edit-Feld mitloggen. Da der neuste Wert immer unten sehen soll, führ ich nach dem hinzufügen jedes Wertes einen Linescroll aus. Leider flackert das Feld dabei sehr stark. Ich habe schon versucht die OnEraseBkgnd zu überschreiben. Dadurch wird es zwar besser, aber weg ist das flackern nicht. Wie bekomme ich denn dieses Flackern komplett weg?



  • hmm, also wenn cih dir nen tipp geben darf für sowat würde ich imma nen ListCtrl nehem oda ne einfach ListBox, Editfeld is da blöde, oda sollen die geloggten sachen bearbeitet werden könne,und selbst das geht noch mit nem ListCtrl zu machen dann haste nen viel bessere Handling, aba um dein problem zurück zu kommen, versuch mal LockWindowUpdate() wenn du anfängst mit deiner funktion, wenn sie fertig ist dann UnlockWindowUpdate() kann sein das es dadurch bessa wird. Muss aba net.


  • Mod

    @edm:
    Und wie fügst Du die Zeilen hinzu. Verwende SetSel und ReplaceSel, in diesem Fall gibt es kein geflacker.
    Ich vermute Du setzt den gesammten Fenstertext neu mit SetWindowText!




  • Mod

    @net
    Das würde den selben Effekt haben wie das bereits erwähnte LockWindowUpdate. Aber das Grundproblem ist, dass man vermeiden sollte das ganze Control neu zu Zeichnen. Und das get nur indem man ReplaceSel verwendet.



  • @martin
    Das mit ReplaceSel funktioniert besser.

    //m_cEdit: control variable des edit-Feldes
    void CFlicker1Dlg::OnButton1() 
    {
      CString csTemp;
      int i;
      for (i=0;i<5000;i++)
      {
        csTemp.Format("Zeile%d\r\n", i);
        //m_cEdit.SetSel(...);// ??
        m_cEdit.ReplaceSel(csTemp);
      }
    }
    

    So funktioniert es zwar, leider bleibt die Anzeige bei Zeile2827 hängen ...
    Woran liegt das? Und auf was muss ich SetSel setzen?



  • edm schrieb:

    So funktioniert es zwar, leider bleibt die Anzeige bei Zeile2827 hängen ...
    Woran liegt das?

    Vermutlich ist dort die Kapazität deines Editfeldes erschöpft (ich kenne die erlaubte Maximalgröße nicht). Als Lösung müsstest du wohl ältere Einträge rausschmeißen.

    Und auf was muss ich SetSel setzen?

    Die Gesamtgröße des bisher eingetragenen Textes (*kurz nachschaut* die müsstest du mit "LineIndex(GetLineCount()-1)+LineLength(GetLineCount()-1)" selber berechnen.



  • @CStoll
    An der Kapazität kann es irgendwie nicht liegen. Wenn ich die Daten in einen String schreibe und den anzeige funktioniert es....


  • Mod

    @edm
    Mit GetWindowTextLength die aktuelle Länge besorgen. Und in SetSel verwenden.

    Ist das evtl. noch ein Win98 Rechner? Dann wäre die Größe auf 32000 ungrad Zeichen begrenzt. Wenn ich Den Zähler mir ansehe kommt es mir gerade so vor...



  • @martin

    Nein, das ist kein Win98 Rechner 🙂 Win2000. Einen längeren CString mit SetWindowText kann ich ja auch anzeigen lassen.

    Wobei ZeileXXXX+CR+LF(11 Zeichen) * 2827 = ca. 31000

    Wenn das mit dem String anzeigen geht, könnte ich auch einen String mitspeichern und den am Ende einfach reinladen. Nur während die Werte erfasst werden sollte halt immer der letzte Wert unten stehen. Im Prinzip muss man somit auch nur so viel Werte speichern wie das EditFeld Zeilen hat(scrollen während der Datenaufnahme muss unbedingt nicht sein)

    Aber so richtig flackerfrei ist das ganze auch noch nicht. Vor allem unterhalb der letzen mit einer Zahl befüllten Zeile flackert immer mal wieder eine Zahl....



  • vielleicht kannste gegen das flackern was mit 'GdiSetBatchLimit(irgendein_hoher_wert)' was ausrichten



  • @net
    keine ahnung, was du damit genau meinst ....

    Sonst keiner ne Idee? Vielleicht die OnPaint überschreiben oder so und da dann in einen MemDC schreiben !?


  • Administrator

    WM_PAINT abzufangen wird dir nicht nützen, da es von dort aus nicht weiter geht. Du kannst den DC nicht weitergeben.

    Ich habe ein wenig gesucht und was anderes gefunden, nämlich die Nachricht WM_PAINTCLIPBOARD. Da könntest du je nach dem nicht nur den CDC durch ein MemDC ersetzen, sondern auch mit einem Rect definieren, was genau neu gezeichnet werden soll. Aber hab des noch nie benutzt, musst du wohl ein wenig selber rumprobieren.
    Aber ich könnte mir vorstellen, dass schon nur der MemDC reichen könnte.

    Grüssli



  • edm schrieb:

    @net
    keine ahnung, was du damit genau meinst ....

    gdi fasst malaktionen zusammen um grafische ausgabe zu optimieren. eventuell hebt sich da was auf z.b. zweimaliges löschen des hintergrundes...


Anmelden zum Antworten