Chatprogramm EditboxProblem
-
Hallo Liebe Community,
Ich hab nach hin und her nun schonmal ein Chatprogramm zum Laufen bekommen

Auch das Problem mit dem Enter-Taste abfangen ist soweit gelöst.Einziges Problem ist jetzt, dass wenn ich einen Text schreibe und Enter drücke das Programm zwar die Nachricht abschickt und das Eingabefeld löscht aber automatisch einen Zeilenumbruch macht weil ich ja Enter gedrückt habe.
Ausschnitte aus dem Quellcode:
LRESULT CALLBACK ChildProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { BYTE cbuf[256]; GetKeyboardState(cbuf); if(message == WM_KEYDOWN && cbuf[VK_SHIFT]&0x80 && cbuf[VK_RETURN]&0x80) { int i = GetWindowTextLength(hEin); char recv[] = "\n"; SendMessage(hEin,EM_SETSEL,i,i); SendMessage(hEin,EM_REPLACESEL,FALSE,(LPARAM)recv); return 0; } if(message == WM_KEYDOWN && cbuf[VK_RETURN]&0x80) { GetWindowText(hEin,Self.message,1900); int TextLength = GetWindowTextLength(hEin); if(TextLength == 0) { MessageBox(hwnd,"Du musst zuerst einen Text eingeben!","Info",MB_OK|MB_ICONINFORMATION); SetWindowText(hEin,""); } else { Verbindung.Send(&Self,hEin); } return 0; } return CallWindowProc ((WNDPROC) PrevWndProcEdit, hwnd, message, wParam, lParam); }Das ist die Funktion die die Tasten der Editbox abfängt.
Die Editbox wir wie folgt deklariert:static LONG_PTR PrevWndProcEdit; ... hEin = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", eingabe, WS_CHILD | WS_VISIBLE | ES_MULTILINE | WS_BORDER, 0, 0, 0, 0, hwnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); PrevWndProcEdit = SetWindowLongPtr (hEin, GWLP_WNDPROC, (LONG_PTR) ChildProc); ...So mein Eingabefeld ist ein Multiline da ich ja auch Zeilenumbrüche haben möchte nur halt nicht durch Enter sonder Shift+Enter.
Wisst ihr rat bzw habt ihr mein Problem verstanden?
Mit freundlichen Grüßen,
xenus
-
subclass mit eigener CALLBACK-Funktion einrichten, dann klappt das. CallWindowProc gehört in diese CALLBACK-Funktion.
-
Sorry aber damit kann ich jetzt nicht direkt was anfangen bzw. steh ich jetzt bisschen aufm Schlauch ich dachte ich hab das schon gemacht mit der Callback-Funktion...
Ich hab ja momentan 2 Callback-Funktionen eine für das Hauptfenster und eins halt für das Editfenster und was meinst du jetzt soll ich machen?
-
Editfenster sind Childfenster des übergeordneten Parentfensters. Sie werden von Windows direkt verabeitet und die Details nur komprimiert an das Parentfenster weitergegen. Willst Du zwischendurch eingreifen, dann ist "subclassing" der einzige Weg! Mache Dich schlau, wie "subclassing" funktioniert.
-
Hab mal geschaut was mit Subclassing gemeint ist.
Wenn ich das richtig gesehen habe handelt es sich doch darum dass man einem Childfenster mit SetWindowLong eine eigene Callback funktion gibt oder nicht?Und das hab ich doch gemacht. Es funktioniert ja auch alles das Problem ist doch nur, dass das Enter noch in der Editbox ausgeführt wird obwohl es schon abgefangen wurde...
-
warum nicht einfach das ENTER am Schluss des Editboxtextes einfach löschen?
char *search search = strrchr(editboxtext, '\n'); if(search){ *search = 0; }
-
Das hab ich auch überlegt nur ich weiß nicht so recht wo ich das jetzt aufrufen soll...
Da wo die Editevents verarbeitet werden oder im Hauptfenster?
Aber vllt gibt es ja auch einen einfacheren Weg..
-
xenus schrieb:
Das hab ich auch überlegt nur ich weiß nicht so recht wo ich das jetzt aufrufen soll...
Da wo die Editevents verarbeitet werden oder im Hauptfenster?
Aber vllt gibt es ja auch einen einfacheren Weg..na hier
if(message == WM_KEYDOWN && cbuf[VK_RETURN]&0x80) { char *search GetWindowText(hEin,Self.message,1900); search = strrchr(Self.message, '\n'); if(search){ *search = 0; }
-
Ja das Problem ist ja die Message wird ja richtig verarbeitet etc.
Und der EditboxText wird auch auf "" gesetzt nur dann kommt nach dem dies alles passiert ist bzw. abgehandelt wurde von der Funktion ein Umbruch rein obwohl das Event eigentlich schon abgearbeitet sein sollte.Deshalb würde es glaub ich nichts bringen das letzte \n vom Eingabetext wegzunehmen.
-
Ja dann musst du hat deinen Text an verschiedenen Stellen deines Programms mal ausgeben, z.B. in eine Datei, um nachzuvollziehn ab wann sich der unerwünschte Zeilen Umbruch einschleicht.
-
Du hast das "subclassing" schon richtig gemacht. Bist Du aber sicher, dass ENTER etc, tatsächlich abgefangen werden? Füge in ChildProc mal Kontrollausgaben ein. Vielleicht fehlt - wie bei Dialogen - eine Abfrage auf WM_GETDLGCODE mit return DLG_WANTALLKEYS oder so etwas ähnliches.
-
Ja darauf wollt ich ja hinaus die Taste wird nicht ganz abgefangen sie wird zwar untersucht und dementsprechend wird gehandelt aber wirklich abgefangen ist sie noch nicht wenn sie nämlich die Callback vom Child verläßt ist der Edittext auch leer aber dann kommt erst der nächste Zeilenumbruch in dem Editfeld...
Also wird sie noch nicht ganz abgefangen ...
-
Ich habe versucht, das Problem mit einem Testprogramm nachzuvollziehen. In einer mehrzeiligen Edit-Box kannst Du das ENTER zwar zu sehen bekommen, aber leider nicht vollkommen abfangen als wäre nichts geschehen. Der Zeilenumbruch bleibt.
-
seid ihr alle hohl oder was lol
static WNDPROC oldProc; LRESULT CALLBACK EditProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_CHAR: if(wParam == VK_RETURN) { SetWindowText(hDlg, ""); return 0; } } return CallWindowProc(oldProc, hDlg, message, wParam, lParam); }
-
LOL

Okay also manchmal hat man aber auch ein Brett vorm Kopf oO
Vielen Dank WM_CHAR war die Lösung
