Enter drücken in (singleline) Editbox im Hauptfenster



  • Hallo Leute!

    Ich habe schon wieder ein Problem und zwar folgendes:
    Ich habe ein singleline Edit-Feld in meine Hauptfenster, bei dem ich gerne eine Aktion ausführen würde, sobald man Enter drückt. Zur Zeit habe ich daneben einen Button dafür, aber das ist sehr unschön immer zur Maus zu wechseln, um dann auf den Button zu drücken.

    Ich habe schon mehrere Sachen versucht und zwar in der Hauptschleife:

    case WM_KEYUP:
                switch(wParam){
                    case VK_RETURN:
                        HWND Foc = GetFocus();
                        if(Foc == hwndSearchEdit){
                            //tue was, funktioniert aber nicht
                        }
                        break;
                }
                return 0;
    

    Weiterhin hatte ich mir überlegt, wenn das Editfeld den Fokus bekommt, den Fokus
    auf den Button zu übertragen, aber dann kann man ja nichts mehr eintippen 😉
    Kann mir einer helfen wie man das am besten macht?



  • Ist dein Hauptfenster ein Dialog?
    Hast Du den Default Button schon gesetzt? (der wird standardmäßig ausgelöst, wenn du im Edit ENTER drückst)



  • peterchen schrieb:

    Ist dein Hauptfenster ein Dialog?
    Hast Du den Default Button schon gesetzt? (der wird standardmäßig ausgelöst, wenn du im Edit ENTER drückst)

    Nein es ist kein Dialog, sondern ein ganz normaler Frame, bei dem ja auch nicht immer wenn Enter gedrückt wird das ganze ausgelöst werden soll, sondern nur wenn man im Edit Feld Enter drückt!



  • du könntest dein editfeld auch subclassen und ne eigene behandlungsrotiene dafür schreiben wo du ganz geziehlt auf WM_KEYDOWN eingehen könntest.



  • Dann ist wahrscheinlich das einfachste, das EDIT-Control zu subclasse, und iin der WNDPROC vom Edit Control das Enter abzufangen (aber WM_KEYDOWN, sonst kommst du zu spät..)



  • EinMensch schrieb:

    Zur Zeit habe ich daneben einen Button dafür, aber das ist sehr unschön immer zur Maus zu wechseln, um dann auf den Button zu drücken.

    Man könnte ja mit Tab zum Button wechseln und dann Enter drücken.

    Du musst das Editfeld subclassen und dort WM_KEYDOWN abfangen.

    edit: Zu spät...



  • Sowas habe ich mir gedacht und auch danach gesucht aber bei google find ich nichts wie man das macht, so toll kenn ich mich da nicht aus. Ist mein erstes Projekt mit der WinAPI...

    Wenn ich ne zweite Callback funktion mache wie sage ich dem Programm dann das er die für das Control verwenden soll?



  • in kurz

    GetWindowLongPtr(GWL_WNDPROC) um die alte rauszubekommen (die mußt du für alle messages aufrufen, die du nicht selbst komplett behandelst)

    Dann SetWindowLongPtr(GWL_WNDPROC) um deine eigene zu setzen



  • Deklaration der Callback in der *.h oder *.cpp

    LRESULT CALLBACK EditProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
    

    In einer Funktion die dir das editfeld erstellt rufst du nach CreateWindow(Ex)

    WNDPROC m_EditProc = (WNDPROC)SetWindowLongPtr(hWndEdit, GWLP_WNDPROC, (LONG_PTR)EditProc);
    

    und die callback funktion an sich sieht so aus

    LRESULT CALLBACK EditProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    
        switch(uMsg)
        {
    		case WM_KEYDOWN:
                        //Mach Was
    		break;
        }
    
      return CallWindowProc(m_EditProc, hWnd, uMsg, wParam, lParam);;
    }
    


  • Ok das funktioniert!
    Hab aber noch eine Frage:
    Werden die Nachrichten, die dort nicht behandelt werden zur normalen WindowProcedure weitergeleitet?



  • wenn ich mich nicht irre, wird jede nachricht in der normalen WindowProcedur nochmal behandelt, sofern du nicht den return wert in der subclass Procedur sendest der in der MSDN verlangt wird.

    für WM_KEYDOWN steht in der MSDN

    MSDN schrieb:

    An application should return zero if it processes this message

    heist für dich, wenn du nicht willst das in der normalen WindowProcedur WM_KEYDOWN nochmals behandelt wird must du in der Subclass Procedur WM_KEYDOWN mit return = 0 bzw. FALSE beenden.


Anmelden zum Antworten