Flackerndes CEdit


  • 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