Editbox-Anfängerproblem
-
danke erstmal für eure hilfe,
Winapi is echt ne harte nuss
. Hab heut auch schon ein der Bücherei meines Vertrauens den Petzold bestellt
.eine sache gibts aber noch

der Quelltext funktioniert bei mir nicht:
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static HWND hwndButton1, hwndEdit2; char* buffer = NULL; int iLength; switch (message) { case WM_CREATE : hwndButton1 = CreateWindow ( "button", "Knopf 1", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 150, 20, 100, 40, hwnd, (HMENU)1, (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL); hwndEdit2 = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", NULL, // <- das ist der Inhalt der Editfelds WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 200, 200, 200, 200, hwnd, (HMENU)2, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); return 0; case WM_COMMAND: switch(LOWORD(wParam)) { case 1: iLength = GetWindowTextLength(hwndEdit2); if(buffer != NULL) { free(buffer); buffer = NULL; } buffer = (char*)malloc(iLength + 1); GetWindowText(hwndEdit2, buffer, iLength + 1); SetWindowText(hwndEdit2, ""); SendMessage(hwndEdit2, EM_SETREADONLY, TRUE, 0); break; case 2: SendMessage(hwndEdit2, EM_SETREADONLY, FALSE, 0); break; } return 0; case WM_PAINT: hdc = BeginPaint (hwnd, &ps); SetTextColor(hdc, RGB(255,0,0) ); SetBkColor(hdc, RGB(255,255,0) ); TextOut (hdc, 20, 20, "Ich bin ein Fenster.", 20); TextOut (hdc, 100, 100, buffer, sizeof(buffer)); EndPaint (hwnd, &ps); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } free(buffer); return DefWindowProc (hwnd, message, wParam, lParam); }Das Programm läuft schon und es gibt auch keine Fehlermeldung, aber er zeigt halt auch den Inhalt vom buffer an der stelle (100, 100) an.
Bin ich einfach nur zu blöd?

Bestimmt wieder so ne kleinigkeit aber wäre toll wenn mir nochmal einer auf die sprünge helfen könnte :-).
-
Das Programm läuft schon und es gibt auch keine Fehlermeldung, aber er zeigt halt auch den Inhalt vom buffer an der stelle (100, 100) an.
Ahja
, wo ist dann dein Problem ? 
TextOut (hdc, 100, 100, buffer, sizeof(buffer));
->>
TextOut (hdc, 100, 100, buffer, strlen(buffer));
PS. Wenns auch nit geht mach einfach mal ne Testausgabe via MessageBox direkt nach dem Auslesen Editfeldes...ein genereller Tipp

-
ja cool mit der messagebox gehts

aber ich raff einfach nicht warum das mit TextOut nicht funktioniert. könntest du mir das erklären?
-
Du musst buffer als static deklarieren:
static char* buffer = NULL;Damit der Wert erhalten bleibt, wenn deine WndProc verlassen wird.
-
ich geb langsam auf,
Is mir auch langsam peinlich wie ich mich anstell.
Danke für deine unglaubliche Geduld Codefinder.
ich versuchs jetzt mal mit 2 Editboxen *lach*.
-
Hm ja, das ist kein Problem...hats denn jetzt funktioniert ?
-
ne hat es leider nicht,
es ist auch bestimmt nur ne kleinigkeit aber es klappt halt einfach nicht.
mit strlen(buffer) gehts auch nicht, da geht er gleich in debugger.
Das Programm startet ja aber er zeigt mir einfach die textout-zeile an.
dem pointer buffer hab ich zwar auch static spendiert aber es leider ohne erfolg...
-
Schick mal Code...: cpp-coding@arcor.de
Das machts langsam interessant

-
hab dir den quellcode geschickt.
hab das ganze auch nochmal mit 2 Editboxen gemacht und es hat optimal geklappt

-
lol, ok hab deine(n) Fehler:
1. wenn du vor dein MsgSwitch schreibst static char'* buffer = NULL; bringt das static auch nix...da es bei jedem eintreten der WndProc immer auf NULL gesetzt wird!...das macht man unter WM_CREATE.
2. wenn man auf den Button klickt musst du dein Fenster auch noch invalidieren mit:
InvalidateRect(hwnd, NULL, FALSE); damit es nach der Neuinitialisierung des Textes auch geupdatet wird
Dann ist noch eine Überprüfung zwingend notwendig:
if(buffer) TextOut (hdc, 10, 10, buffer, strlen(buffer));Damit wir strlen(...) nit außer Bahn werfen...:
Hier für alle nochmal der Code...:
#include <windows.h> #include <stdio.h> #include <stdlib.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow) { char szName[] = "Fensterklasse"; HBRUSH MyBrush = CreateSolidBrush( RGB( 0, 150, 255 ) ); WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hI; wc.hIcon = LoadIcon (NULL, IDI_WINLOGO); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = MyBrush; wc.lpszMenuName = NULL; wc.lpszClassName = szName; RegisterClass (&wc); HWND hwnd = CreateWindow (szName, "Interaktives Fenster", WS_OVERLAPPEDWINDOW, 100, 100, 800,600, NULL, NULL, hI, NULL); ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); //----------------------------------------------------------------------------------- MSG msg; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } DeleteObject(MyBrush); // Objekt freigeben!! return msg.wParam; } //----------------------------------------------------------------------------------- LRESULT CALLBACK WndProc (HWND hwnd, UINT uiMessage, WPARAM wParam, LPARAM lParam) { static HWND hwndButton1, hwndEdit2; static PTCHAR pszBuffer; // TCHAR wg. UNICODE Kompatibilität switch(uiMessage) { case WM_CREATE : pszBuffer = NULL; hwndButton1 = CreateWindow ( "button", "Knopf 1", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 150, 20, 100, 40, hwnd, (HMENU)1, (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL); hwndEdit2 = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 200, 200, 200, 200, hwnd, (HMENU)2, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); return 0; case WM_COMMAND: switch(LOWORD(wParam)) { case 1: if(pszBuffer != NULL) { delete [] pszBuffer; pszBuffer = NULL; } int iLength; iLength = GetWindowTextLength(hwndEdit2); pszBuffer = new TCHAR[iLength + 1]; GetWindowText(hwndEdit2, pszBuffer, iLength + 1); SetWindowText(hwndEdit2, NULL); SendMessage(hwndEdit2, EM_SETREADONLY, TRUE, 0); InvalidateRect(hwnd, NULL, FALSE); // Fenster updaten return 0; case 2: SendMessage(hwndEdit2, EM_SETREADONLY, FALSE, 0); return 0; } return 0; case WM_PAINT: PAINTSTRUCT ps; BeginPaint (hwnd, &ps); SetTextColor(ps.hdc, RGB(255,0,0)); SetBkColor(ps.hdc, RGB(255,255,0)); TextOut (ps.hdc, 20, 20, "Ich bin ein Fenster.", 20); SetTextColor(ps.hdc, RGB(255,0,0)); SetBkColor(ps.hdc, RGB(255,255,0)); if(pszBuffer != NULL) TextOut(ps.hdc, 20, 70, pszBuffer, lstrlen(pszBuffer)); // lstrlen wg. UNICODE Kompatibilität EndPaint(hwnd, &ps); return 0; case WM_DESTROY: if(pszBuffer != NULL) { delete [] pszBuffer; pszBuffer = NULL; } PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, uiMessage, wParam, lParam); }PS: Hab auch die (neue) Speicherreservierung aus C++ drin

EDIT: Mir ist gerade aufgefallen, dass du MyBrush erstellst aber nie löscht...

-
cool danke jetzt klappts,
tut mir leid wenn ich so viele umstände bereitet hab.
schönen tag noch
