Ausgabefenster für Logeinträge, wie richtig erstellen?
-
Um in meiner Anwendung Log-Einträge sichtbar zu machen benutze ich ein Multiline Editcontrol. Es werden wärend des Programmablaufes immer wieder Zeilen an den Text in der Editcontroll angehängt. Leider ist mir bis jetzt nur eine "Noob" Lösung für dieses Einfügen eingefallen. Mit GetWindowText hole ich mir den ganzen text aus dem Editcontroll, per strcat wir der neue Log-Eintrag angefügt und per SetWindowText wird das ganze zurück in die Editcontrol geschrieben.
Habe ich jetzt kurz bevor ein neuer Eintrag erscheint etwas in Eeditfeld markiert und/oder ist mein Caret irgendwo in der Mitte der Log-Einträge, so ist die alles nach dem Einfügen verschwunden.
Ein schönes beispiel wie es richtig funktioniert, ist das Ausgabefenster vom Visual Studio. Wenn ich hier einen Build starte der eine Vielzahl von Einträgen in das Ausgabefenster nachsichzieht, so kann man sehen, das der markierte Text und das gesetzte Caret und der Linescroll immer noch vorhanden sind egal wieviele Einträge danach noch folgen.
So würde ich das auch gerne realisieren, wie geht das, wer kann helfen?
-
Einfach speichern was du schon ausgegeben hast und die nächste Ausgabe mit strcat oder wie auch immer dranhängen und mit SetWindowText ins Fenster schreiben.
-
Nimm eine ListBox mit WS_VSCROll und füge neue Einträge mit SendMessage (hwndListbox,LB_ADDSTRING,0,(LPARAM)line) hinten an.

Die Logzeilen füllst du mit strcpy, etc.
-
berniebutt schrieb:
Nimm eine ListBox mit WS_VSCROll und füge neue Einträge mit SendMessage (hwndListbox,LB_ADDSTRING,0,(LPARAM)line) hinten an.

Die Logzeilen füllst du mit strcpy, etc.Hast du dir mal das Verhalten von so einer Listbox reingezogen? Da entspricht meine alte und in meinen Augen unzureichende Lösung ja noch ehr der gestellten Anforderung. Das ist keine Alternative, trotzdem Danke für die Mühe.
-
Mad*Max schrieb:
Hast du dir mal das Verhalten von so einer Listbox reingezogen? Da entspricht meine alte und in meinen Augen unzureichende Lösung ja noch ehr der gestellten Anforderung. Das ist keine Alternative, trotzdem Danke für die Mühe.
Zum Anzeigen und Lesen von Ergebnissen eines Programmlaufes - hier Log-Einträge - sind Listboxen ideal und einfach zu realisieren. Man kann und sollte zuvor besser eine Log-Datei beschreiben und aus dieser bei Bedarf die Listbox aufbauen. Das Verhalten von so einer Listbox habe ich mir schon reingezogen, weil ich sie für viele Dinge verwende.

Deine gestellte Anforderung hatte ich wohl nicht voll verstanden. Den Hinweis auf Visual Studio konnte ich nicht nachvollziehen, weil ich einen anderen Compiler benutze. Wozu nachträgliche Möglichkeiten zum Editieren und Markieren?

In der Seefahrt werden Logbücher geführt. Die sind auch nichts völlig anderes!
Aber bitte, wenn du unbedingt etwas komplizierteres willst. Dann musst du dich aber für alle hier präziser erklären! :p
-
berniebutt schrieb:
Einträge - sind Listboxen ideal und einfach zu realisieren.
Einfach ja, aber ideal? In einem Edit-Control kann ich die Texte jedenfalls auch mal in die Zwischenablage kopieren (und dafür muss man noch nicht mal was machen). Das finde ich viel idealer.
Das Anhängen von Texten in Edits ist auch nicht weiter wild:
void Edit_AddText(HWND hWnd, LPCTSTR lpText) { DWORD dwStart = 0, dwEnd = 0; int nLen; nLen = GetWindowTextLength(hWnd); SendMessage(hWnd, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd); SendMessage(hWnd, EM_SETSEL, (WPARAM)nLen, (LPARAM)nLen); SendMessage(hWnd, EM_REPLACESEL, (WPARAM)FALSE, (LPARAM)lpText); SendMessage(hWnd, EM_SETSEL, (WPARAM)dwStart, (LPARAM)dwEnd); }
-
berniebutt schrieb:
Deine gestellte Anforderung hatte ich wohl nicht voll verstanden. Den Hinweis auf Visual Studio konnte ich nicht nachvollziehen, weil ich einen anderen Compiler benutze. Wozu nachträgliche Möglichkeiten zum Editieren und Markieren?

Hier zu 100% die Arbeitsweise wie ich sie mir vorgestellt habe.
http://www.codeproject.com/KB/edit/editlog.aspx
Ich kann während die Log geschrieben wird bliebigen Text markieren (mitte von Zeile etc..) und meine Markierung bleibt erhalten, auch wenn etwas vom Programm ans Ende der Editcontroll eingefügt wird. Für manchen unwichtig für mich wichtig. Wenn schnell Einträge aufeinander folgen könnte ich sonst nicht die gewünschten Passagen des Textes in die Zwischenablge kopieren, weil ja die Markierung weg wäre. Das ist der Hintergrung, warum so und nicht anderst. Da ich vorher keine andere Anwendung kannte die dies realisiert, habe ich eben das Ausgabefenster von Visual Studio als Beispiel angegeben, ist ja eigentlich gar nicht so abwegig, dass Leute aus diesem Forum auch diese Software verwenden.
-
Mox schrieb:
void Edit_AddText(HWND hWnd, LPCTSTR lpText) { DWORD dwStart = 0, dwEnd = 0; int nLen; nLen = GetWindowTextLength(hWnd); SendMessage(hWnd, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd); SendMessage(hWnd, EM_SETSEL, (WPARAM)nLen, (LPARAM)nLen); SendMessage(hWnd, EM_REPLACESEL, (WPARAM)FALSE, (LPARAM)lpText); SendMessage(hWnd, EM_SETSEL, (WPARAM)dwStart, (LPARAM)dwEnd); }sieht auch nicht schlecht aus. Danke das werde ich auch mal ausprobieren.