Textausgabe im Textfeld
-
Hi,
ich habe ein Textfeld erstellt, in welchem ich einen Text ausgebe. Das klappt auch wunderbar. Der Text ist
CHAR lpszTrouble[] = "When in the Course of human Events " "it becomes necessary for one People " "to dissolve the Political Bands which " "have connected them with another, and " "to assume among the Powers of the " "Earth, the separate and equal Station " "to which the Laws of Nature and of " "Nature's God entitle them, a decent " "Respect to the Opinions of Mankind " "requires that they should declare the " "causes which impel them to the " "Separation. ";(einfach ein dumb Text von der MSDN Seite). Ich gebe ihn problemlos mit Zeilenumbrüchen mit folgendem Code aus:
SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)lpszTrouble);Wie kann ich nun jedoch eine Datei einlesen, die auch Text mit Zeilenumbrüchen ausgibt? In meiner Datei sind einfach 3 Zeilen sinnloser Text, und er wird einfach in einer Zeile ausgegeben. Die Zeilenumbrüche werden durch einen quadratischen Block ersetzt. \n am Ende der Zeilen wird auch nur als Block dargestellt.
Mfg,
iuiz
-
Hast Du Deinem "Textfeld" die Eigenschaft Multiline verpasst?
-
Jo
hEdit = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", // predefined class NULL, // no window title WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL, 650, 60, 300, 300, hWnd, // parent window NULL, // edit control ID ((LPCREATESTRUCT) lParam) -> hInstance, NULL); // pointer not needed
-
Hier ist der Code, mit dem ich jetzt die Datei einlese. Das Create Window hab ich momentan auch wieder ein wenig anders:
#include <string> //[...] using namespace std; ifstream in("data.txt"); string ch; while(!in.eof()) { ch+=in.get(); } hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", ch.c_str(), // <- das ist der Inhalt der Editfelds WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, //[...]Sorry für den Doppelpost....

-
Wahrscheinlich hast du in der Textdatei nur \n - du brauchst aber \r\n

-
Danke für den Tip. Ich loope jetzt einfach durch die Datei und setze wenn ich \n finde \r ein und ins nächste Feld \n.
Das Problem dass ich dabei zuerst hatte, war dass ich gedacht habe, dass \r\n ein Feld im Arry belegt.char data[300]; char ch; FILE *fp; fp = fopen("data.txt", "r"); int position=0; while((ch = fgetc(fp)) != EOF) { if('\n'==ch) { data[position]='\r'; data[(position+1)]='\n'; position++; } else data[position]=ch; position++; } hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", data, // <- das ist der Inhalt der Editfelds WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 0, 490, 640, 200, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL);Jetzt noch eine kleinigkeit: Wie kann ich char data[300]; so initialisieren, dass nicht mehr als die benötigten Felder im Speicher reserviert werden? Die Datei hat z.B. 251 Zeichen. Es sind 3 Zeilenumbrüche drinn, also kommen nochmal 3 Zeichen mehr dazu (aus '\n' wird '\n' '\r').
Ich habe folgenden Code versucht:
using namespace std; ifstream in("data.txt"); int posi=0; string ch2; while(!in.eof()) { ch2+=in.get(); posi=posi+1; }; const int size=ch2.length(); char data[size];Jedoch bekomme ich den Fehler
"error C2057: Konstanter Ausdruck erwartet" (in der Zeile, die hier die letzte ist) size ist doch const int......
-
Du könntest malloc(),LocalLock(), (new und delete) oder sonstwas benutzen...
char *data; data=(char*)malloc( size ); // size Bytes Speicher holen // Irgendwas mit data machen free(data); // Speicher wieder freigeben.
-
Ansonsten wenn alles nicht hilft dann erstelle Dein Textfeld vorher (z.B. WM_INITDIALOG oder WM_CREATE), lese danach die Datei aus und benutze dann SetDlgItemText(), um dem Textfeld den Text zu verpassen.
-
Hat geklappt.
Danke für die Hilfe.