Text im Editfeld per Button ändern
-
Hi @ All
Also ich beschäftige mich zur Zeit mit einem Programm mit dem ich in einer TXT-Datei nach einem bestimmten wort suchen kann, und das ergebnis in einem Editfeld ausgebe. Dafür erzeuge ich im Bereich WM_CREATE ein Editfeld. Davor lese ich die Txt-Datei aus.
Das sieht dann so aus.
char * buffer = NULL; FILE *fz; int iFileSize; fz = fopen("text.txt", "rb"); if(fz != NULL) { fseek(fz, 0, SEEK_END); iFileSize = ftell(fz); buffer = (char *)malloc(iFileSize); fseek(fz, 0, SEEK_SET); fread(buffer, 1, iFileSize, fz); fclose(fz); } hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", buffer, // <- das ist der Inhalt der Editfelds WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 10, 50, 200, 200, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); free(buffer);Nun... Bis dahin auch noch nicht wirklich ein Problem.
Jetzt wird jedoch jedes mal wenn ich das Fenster öffne die Txt ausgelesen und in das Feld eingefügt. Ich möchte jedoch das es erst eingelesen wird wenn ich einen Button drücke.Doch das kriege ich leider nicht hin.
Wenn ich den Button drücke, versuche ich die Nachricht WM_COMMAND zu bearbeiten.
Auch da kann ich die txt auslesen.
Doch leider kann ich das ausgelesene nich in das Editfeld schreiben welches ich bei WM_CREATE erzeugt habe. Wenn ich das Editfeld in WM_COMMAND Bereich erstellen möchte kriege ich einen Laufzeitfehler präsentiert.Kann mir da vllt jemand einen wink mit dem Zaunpfahl geben.
Herzlichen dank schon mal
Sqwan...Hier auch mal der rest des progs..
Falls der Fehler woanders liegt.#include <windows.h> #include <stdio.h> #include <stdlib.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); static HWND hEdit; static HWND hButton; static HWND hEdit1; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hWnd; MSG msg; WNDCLASS wc; const char szAppName[] = "Editcontrol Tutorial"; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szAppName; RegisterClass(&wc); hWnd = CreateWindow( szAppName, "Editcontrol Tutorial", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_CREATE: { char * buffer = NULL; FILE *fz; int iFileSize; fz = fopen("text.txt", "rb"); if(fz != NULL) { fseek(fz, 0, SEEK_END); iFileSize = ftell(fz); buffer = (char *)malloc(iFileSize); fseek(fz, 0, SEEK_SET); fread(buffer, 1, iFileSize, fz); fclose(fz); } hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", buffer, // <- das ist der Inhalt der Editfelds WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 10, 50, 200, 200, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); free(buffer); hButton = CreateWindow("button", "Beenden", WS_CHILD | WS_VISIBLE, 110, 10, 100, 20, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); hEdit1 = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "", // <- das ist der Inhalt der Editfelds WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 10, 10, 100, 20, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); return 0; } case WM_COMMAND: { return 0; } case WM_SIZE: { //MoveWindow(hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); return 0; } case WM_CLOSE: { FILE *fz; char *buffer = NULL; int iLength; iLength = GetWindowTextLength(hEdit); buffer = (char *)malloc(iLength); GetWindowText(hEdit, buffer, iLength); fz = fopen("text.txt", "wb"); fprintf(fz,"%s\n",buffer); fclose(fz); free(buffer); DestroyWindow(hWnd); return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); }
-
Setz den Text per SendMessage in das Feld
-
probiers mal mit
"SetWindowText"
-
Hinweis: Diese (globalen) Variablen:
static HWND hEdit; static HWND hButton; static HWND hEdit1;sollten lokal in der WndProc definiert werden; globale Variablen sollte man vermeiden, wenn das möglich ist (und hier ist es möglich)
.
-
Also ich habe mich mal über SetWindowText erkundigt.
Jedoch komme ich zu dem schluss das ich das nicht brauchen kann, da ja nicht angegeben wird von was genau geändert werden soll.SetWindowText(hWnd, "Die Position des Fensters wurde verändert");
Das habe ich als bsp gefunden und da kann ich ja nicht angeben das ich das edit feld ändern möchte.
Wenn ich SendMessage(hWnd, WM_CREATE, 0, 0);
benutze kriege ich wieder einen Laufzeitfehler.
Kann es sein das man WM_CREATE nicht machen darf, oder ist da noch was in meinem Code falsch?
-
Sqwan schrieb:
da ja nicht angegeben wird von was genau geändert werden soll.
Doch?! klar?! Du gibst den Handle des Edit-Felds an (1.Parameter).
-
in deinem fall:
SetWindowText(hEdit, "Die Position des Fensters wurde verändert");
-
Thx
Mit SetWindowText(hEdit, buffer); kann ich per Buttonklick die daten die ich brauche nutzen.@Codefinder
Warum mussstatic HWND hEdit; static HWND hButton; static HWND hEdit1;local dafiniert werden?