Flackern im CRichEditCtrl

jokey2

Erfahrenes Mitglied
Hallo Gemeinde!

In meiner Anwendung habe ich ein Logfenster, das mit einem CRichEditCtrl realisiert ist. Dort gebe ich Meldungen aus, die teils von meinem Programm, teils von anderen Anwendungen kommen, die von meinem Programm gestartet werden. Diese Meldungen können manchmal recht schnell aufeinander folgen.

Die Ausgabe mache ich folgendermaßen:

Code:
int iLineCount = 0;
 std::string::size_type stCRIndex = 0;
 while((stCRIndex = strMessage.find('\n', stCRIndex)) != std::string::npos)
 {
  iLineCount++;
  stCRIndex++;
 }
 m_pEditWnd->SetSel(-1, -1);
 m_pEditWnd->ReplaceSel(strMessage.c_str());
 m_pEditWnd->SetSel(-1, -1);
 m_pEditWnd->LineScroll(iLineCount);
 m_pEditWnd->RedrawWindow();
 m_pEditWnd->GetParent()->RedrawWindow();

Die Erzeugung des Controls geschieht so:

Code:
pNewEdit->Create(WS_BORDER | WS_VSCROLL | WS_HSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_LEFT | ES_MULTILINE | ES_READONLY, crTab, this, iNewID);

Ich mach also folgendes:
Erst zähle ich die Zeilenumbrüche, um die Anzahl der Zeilen zu ermitteln. Das brauche ich später zum scrollen. Dann hänge ich den neuen Text an den vorhandenen an und setze die Auswahl wieder auf das Ende des Textes. Danach scrolle ich die ermittelte Anzahl von Zeilen nach unten, damit immer das Ende des Textes im Fenster sichtbar ist. Mit den beiden letzten Zeilen will ich erreichen, daß die Anzeige auch tatsächlich jedes Mal aktualisiert wird (DasCRichEditCtrl ist auf einer Tab-Seite, wenn ich die nicht auch aktualisiere, werden die Scrollbalken nicht mehr richtig gezeichnet).

Das Problem ist, daß das Control manchmal beim Eintreffen neuer Meldungen flackert. Bei langsameren Rechnern mehr als bei schnelleren.

Wenn mir jemand helfen könnte, diesen ziemlich unschönen Effekt zu beseitigen, wäre ich sehr dankbar.
 
Ich weiß ja, daß es schon ein paar Threads zum Thema flackern gibt, die helfen mir allerdings nicht weiter.
Es wäre schön, wenn mir jemand bei meinem Problem helfen könnte. Das Flackern ist jetzt zwar nicht kritisch, aber doch unschön.
 
Leider kenne ich mich mit der MFC bei Weitem nicht gut genug aus, um dir da mit Source helfen zu können. Dazu habe ich die letzten Wochen zu oft erleben müssen, daß Microsoft unwahrscheinlich gerne sämtliche Normen ignoriert und sein eigenes Süppchen kocht.

Aber vom reinen Prinzip her bin ich immer so gefahren, daß ich das Sammeln und Verarbeiten von Daten unsichtbar im Speicher gemacht habe und die Daten dann mit einer dafür eingerichteten Routine nur noch möglichst schnell in eine entsprechende sichtbare Komponente kopiert habe. Ich glaube, bei Bitmap hieß das früher "blitting", keine Ahnung, wie man heutzutage dazu sagt. Bei meinem Projekt hier habe ich z.B. ein sichtbares RichEdit, das mit einem Timer gekoppelt ist, der jede halbe Sekunde aus einem unsichtbaren Richedit die aktuellsten Daten abholt. Flackereffekte habe ich dabei keine.
 
Wie hängst Du denn die neuen Daten an Dein sichtbares RichEdit an und wie aktualisierst Du die Anzeige?
 
Hi Jokey,

das Flackern kommt in den meisten Fällen daher, dass der gesamte Hintergrund erstmal gelöscht wird, bevor das Control neu gezeichnet wird.

Dies verhinderst du folgendermaßen :

Füge einen EventHandler auf deiner PropertyPage für WM_ERASEBKGND hinzu.

Code:
BOOL CMyPropertyPage::OnEraseBkgnd(CDC* pDC)
{
    // Nehmen wir an m_richEdit ist dein Control, welches flackert
    // Falls das RichEdit Control den gesamten Clientbereich belegt:
    return 1;
    // Wenn das RichEdit Control nicht den gesamten Clientbereich belegt:
    CRect clientRc;
    GetClientRect(&clientRc);
    CRect richEditRc;
    m_richEdit.GetWindowRect(&richEditRc);
    ScreenToClient(&richEditRc);
    pDC->ExcludeClipRect(&richEditRc);
    pDC->FillSolidRect(,0,0,clientRc.Width(),clientRc.Height(), GetSysColor(COLOR_BTNFACE));
    return 1;
}

Sollte das Flackern stark reduzieren bzw. eliminieren ;-)

Schönen Gruß,

Peter
 
Zuletzt bearbeitet:
Erstmal Danke für die Antwort und sorry, daß ich mich jetzt erst melde, aber ich war im Urlaub. Ich werde es in den nächsten Tage ausprobieren und mich dann wieder melden.
 
Hallo

Ich bin ziemlicher C++ Neuling. Mache gerade die Schule zum staatlich geprüften Elektro-Techniker.

Dabei lernt man ja auch ein bisschen Programmieren. Bei uns ist das C/C++.
Leider nur sehr wenig. Also Ausgabe von ein paar Zahlen und hier und da ein Rechteck oder Kreis malen.

Hab mich jetzt mal die letzten Tage hingesetzt und versucht ein mini-spielchen zu machen. Hab mich dafür entschieden das Browserspiel http://www.drogendealer.de/ „nachzubauen“. Nicht weil ich Drogen toll finde, sondern weil es ein einfaches Spielprinzip ist und mir als leicht umzusetzen erschien.

Hier ist meine aktuelle Version:
http://rapidshare.com/files/30546972/drogendealer_mit_preisbuffer.rar
hoffe ich hab alles nötige ins rar gepackt.

Hab jetzt halt nur das Problem das es furchtbar flackert. Hab probiert die oben beschriebe Methode bei dem Pogramm anzuwenden... bin aber kläglich gescheitert… mir fehlen einfach die Kenntnisse und ich habe keine Ahnung wo ich darüber was finden kann. Weil ich nicht einmal weiß wonach ich suchen muß :confused:

Kann mir vielleicht einer helfen? Wäre euch echt dankbar.
Hoffe ihr könnt mit dem Pogramm was anfangen und blickt da durch. Würde ja euch gerne die wichtigsten Zeilen oder Infos rauskopieren und hier einfügen.. nur habe ich keine Ahnung was wichtig ist und was nicht :confused:

Ein paar gute links zu dem Thema wären auch nicht schlecht. Wenn ihr sie habt. Möcht ja schon verstehen was ich da mache und nicht nur billig kopieren.

Und bitte nicht über meinen Programmierstil lachen… mach das ja erst ein paar Wochen... :)

Mfg
Soltep
 
Hi,

oh ja, das flackert ja wirklich stark.

Das Problem ist, dass du erst die Methode OnEraseBkgnd der Basisklasse aufgerufen hast.
Genau diese Methode löscht den gesamten Hintergrund.

Wenn du diese nicht aufrufst und nur TRUE(1) zurückgibst (TRUE = Message wird nicht weiter behandelt ), dann flackert auch nix mehr ;-)


Code:
BOOL CKlausurView::OnEraseBkgnd(CDC* pDC) 
{
	return TRUE;
}

Aber sieht so erst mal schon sehr nett aus...

weiter so.

Peter
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück