SendMessage und EditFeld
-
Hallo,
ich bin ein ziemlicher Neuling in Sachen WinApi und stehe im Moment vor einem Problem, bei dem ich schlicht den Wald vor lauter Bäumen nicht mehr sehe. Ich will eine Eingabe aus einem Textfeld holen und diese in einer MessageBox ausgeben. Vermutlich eine ganz einfache Sache... ich bin aber blockiert. Ich nutze den C++Builder 10.1 Berlin. Wer kann mir weiterhelfen?
Vielen Dank.
case WM_COMMAND: if (HIWORD(wParam) == BN_CLICKED) { if (LOWORD(wParam) == 1) { LPWSTR buffer[256]; SendMessage(hWndEdit, WM_GETTEXT, sizeof(buffer)/sizeof(buffer[0]), reinterpret_cast<LPARAM> (buffer)); MessageBox(0, (LPWSTR) buffer, _T("Meldung"),0); } if (LOWORD(wParam) == 2) { PostQuitMessage(WM_QUIT); } } return 0;
-
Es wäre hilfreich zu wissen was der Fehler ist. Hier ist der Fehler offensichtlich, aber für die Zukunft sag uns auch was nicht funktioniert und was der Fehler ist.
Ok, fangen wir mal an den Code zu untersuchen:
MessageBox(0, (LPWSTR) buffer, _T("Meldung"),0);
Warum der Cast von buffer zu LPWSTR? Weil der Compiler sonst meckert, denn MessageBox will einen LPTSTR. Einfach irgendwelche Casts durchzuführen macht den Code nicht richtig, sondern stellt nur den Compiler ruhig.
LPWSTR buffer[256];
Hier erstellst du ein Array von 256 Elementen vom Typ
LPWSTR
, du möchtest aber nicht 256 Pointer aufWCHARS
haben sondern nur einen. Ändere diese Zeile zuTCHAR buffer[256];
Warum T und nicht W? Musst du selbst wissen, ob du die allgemeine T Variante oder die spezielle W Variante möchtest. Da du in der
MessageBox
aber auch das Makro_T()
verwendest, gehe ich davon aus, dass du eher die allgemeine T Variante möchtest. Dann kannst du die Zeile mit derMessageBox
auch ändern zu:MessageBox(0, buffer, _T("Meldung"),0);
-
Hi Biolunar,
danke für deine Hilfe. Hat mir geholfen, wobei ich einen zweiten dicken Fehler völlig übersehen hatte. Das Problem war, dass die MessageBox leer blieb. Jetzt weiß ich, dass das unter anderem am Handle hWndEdit gelegen hat, das ich in WM_COMMAND deklariert hatte, also an der falschen Stelle.
Problem ist gelöst.
-
Hi,
der eingegebene Text in Editfields ist im Endeffekt deren Fenstertitel, d.h. einfach kannst du auch GetWindowText(A/W) verwenden, ist einfacher zu merken als die Argumente für SendMessage, welches von GetWindowText vermutlich im Hintergrund für dich gemacht wird.