Chatprogramm EditboxProblem



  • 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 😉


Anmelden zum Antworten