wxTextCtrl & Zeilenumbruch
-
Hallo erstmal,
das ist mein erster Beitrag hier im Forum und ich habe eine Frage bezüglich wxWidgets.
Ich habe mich seit einiger Zeit mit wxWidgets beschäftigt und schreibe gerade ein Programm, dass Daten einer seriellen Schnittstelle empfängt und ausgibt.
jedoch sind in den einkommenden Daten keine Newlines (\n) enthalten und so erhalte ich eine lange Zeile, die dynamisch umbgebrochen wird.
Das wird jedoch nach einer gewissen Zeit ziemlich CPU lastig und deshalb habe ich mir gedacht, dass es sinnvoll wäre einen echten Zeilenumbruch statt eines dynamischen zu "schaffen". Dazu meine 1. Frage: Kann das ein wxTextCtrl automatisch machen, zB durch Übergabe eines besonderen Window-Styles?Da ich das nicht gefunden habe, habe ich versucht das selbst zu programmieren, und das wxTextCtrl durch eine Klasse zu ersetzten, die vom wxTextCtrl abgeleitet ist. Diese Klasse soll dann vor dem hinzufügen des Buchstaben checken ob die Zeile voll ist und dann ggf eine Newline einfügen. Der Teil der das macht sieht so aus:
if(m_chars >= m_maxChars) { AddNewLine(); }
Wobei m_chars ganz einfach die Zeichen in der Zeile zählt und m_maxChars ein berechnter Int ist:
int width; int height; GetClientSize(&width, &height); m_maxChars = width / GetCharWidth();
Das Problem ist jedoch, dass die Zeilen zwar immer ein festes Ende haben, dieses jedoch immer um einiges länger als die Breite des Fensters ist, was meiner Meinung nach an einem fehlerhaften Wert von GetCharWidth() liegt.
Daran, dass dies ein "Durchschnittswert" der Breite der Buchstaben ist kann es auch nicht liegen, da die eingestellte Schriftart eine Monospace Schriftart ist und somit alle Zeichen gleich breit sind.Hat jemand eine Idee wie ich das Problem am besten löse?
Danke schonmal im Vorraus,
Click
-
Ich denke du verwendest schon wxTE_MULTILINE als Style.
Ich würde jeweils den ankommenden Puffer manipulieren und einfach alle x Zeichen ein newline einfügen.
Allerdings musst du dich damit auch fragen, ob du nicht den Zeichenstrom und die Darstellung damit verfälschst.Und evtl. erreichst du das schon, in dem du horizontales Scrollen ausschaltest, dann müsste er am ende Umbrechen.
-
Ja ich verwende wxTE_MULTILINE als Style.
Wenn ich den ankommenden Puffer manipuliere muss ich entweder eine von der Fenstergröße unabhängige Zeilenlänge bestimmen, oder diese Zahl genauso berechenen, darum versteh ich den Sinn davon noch nicht so ganz
Um die Verfälschung der Daten mache ich mir im Moment weniger Gedanken als um die schnelle Überlastung der CPU, gerade wenn die Zeichen in Hex ausgegeben werden und die Zeile sehr schnell sehr lang wird.
Ein horizontaler Scrollbalken ist nicht eingestellt.
Danke trotzdem,
Click
-
Naja, dann mach doch einen fixen Zeilenumbruch, alle 20 Zeichen oder so.
Irgendwie berechnen wirst du es immer müssen.
-
Ich will ja auch einen berechneten Wert, der nach vergrößern oder verkleinern des Fensters neu berechnet wird.
Das Problem ist nur, dass GetCharWidth() einen falschen(?) Wert gibt und ich ihn nicht so richtig berechnen kann.