Editbox-Anfängerproblem
-
danke für deine hilfe miller_m,
blöd nur dass ich immernoch Fehlermeldungen bekomme:
d:\C-Programme\test\main.cpp(81) : error C2664: 'GetWindowTextA': Konvertierung des Parameters 2 von 'char (*__w64 )[512]' in 'LPSTR' nicht möglich
wie gesagt , ich bin anfänger und vielleicht noch etwas schwer von begriff also habt nochsicht mit mir...
danke
-
getwindowtext erwartet als zweiten parameter einen zeiger auf char array.
[cpp]GetWindowText(hwndEdit2, **&**buffer, sizeof(buffer));[/cpp]
-
okay,
dass hab ich verstanden und hatte ich auch schon geändert, aber das ändert nix am Fehler.
Hier nochmal der gesamte Quellcode:
#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); } return msg.wParam; } //----------------------------------------------------------------------------------- LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static HWND hwndButton1, hwndEdit2; static char buffer[512] = {0}; 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", buffer, // <- das ist der Inhalt der Editfelds WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 200, 200, 200, 200, hwnd, (HMENU)2, (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL); return 0; case WM_COMMAND: switch(LOWORD(wParam)) { case 1: GetWindowText(hwndEdit2, &buffer, sizeof(buffer)); //<----immernoch hier der Fehler 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, 700, buffer, sizeof(buffer)); EndPaint (hwnd, &ps); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } free(buffer); return DefWindowProc (hwnd, message, wParam, lParam); }
-
sorry fehler von mir
GetWindowText(hEdit2, &buffer[0], sizeof(buffer));TextOut (hdc, 20, 40, buffer, strlen(buffer));sollte die länge des strings angeben nicht die grösse
und das free(buffer); kannst du dir jetzt schenken
-
Hoi,
miller_m schrieb:
sorry fehler von mir
GetWindowText(hEdit2, &buffer[0], sizeof(buffer));lol, Warum nicht einfach:
GetWindowText(hEdit2, buffer, sizeof(buffer));Denn: Da buffer ein statisches Array ist, impliziert 'buffer' ja ein Zeiger auf den ersten 'Platz' im Array.
Dann vllt noch dazu:
Rille schrieb:
buffer = malloc(iLength); // <----------Fehler hier !Compiler schrieb:
d:\C-Programme\test\main.cpp(88) : error C2440: '=': 'void *' kann nicht in 'char *' konvertiert werden
Naja der Return Wert von malloc() ist void*, da du aber ein Char-Array reservierst, musst du den Rückgabewerte infach casten, also so:
buffer = (char*)malloc(iLength + 1);Ich würde dir aber empfehlen es so zu machen:
buffer = new char[iLength + 1];
PS: Du musst iLength + 1 allokieren für die Null-Terminierung des C-Strings, die wird meines Wissen bei GetWindowTextLength nicht berücksichtigt.

Du kannst das mit der dynamischen Speicherreservierung schon so machen, musst aber deinen Code n bissl umbauen: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, 700, buffer, 20); /* wieso 20 ??? */ EndPaint (hwnd, &ps); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; }PS: Hoffe das war hilfreich

-
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
