Tabstop?



  • Ich habe ein Window mit 8 Child "edit" Windows
    Nun möchte ich, dass er beim drücken von TAB nicht im edit Feld vorwärts springt sondern den Focus ins nächste edit Feld setzt

    Klar, ich könnte KEYDOWN abfragen und via SetFocus machen, aber geht das nicht auch einfacher?
    Ich habe schon mit WS_GROUP und WS_TABSTOP herumprobiert, aber ich schätze da übersehe ich irgendwas, was noch zusätzlich eingestellt werden muss?



  • Hi,

    Jedes Control das mit dem Tab angesprungen werden soll muss den WS_TABSTOP Style besitzen und in deiner MessageLoop musst du IsDialogMessage() einbauen.

    MSG msg;
    while (GetMessage(&msg, 0, 0, 0)) 
    {
        if(!IsDialogMessage(hwnd,&msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    

    Wichtig, wenn du mehrere Fenster hast, musst du IsDialogMessage für jedes Fenster mit eigenem WndProc abfragen. (Bis ich da drauf gekommen bin hat es ne Ewigkeit gebraucht ^^)

    Edit: Achja, und irgendein Control von denen mit WS_TABSTOP Style braucht den Eingabefokus (kann man mit SetFocus() setzen);

    BR
    Vinzenz



  • ach du Jammer, da ist ja meine Lösung mit KEYDOWN abfragen noch einfacher, und ich dachte ich machs mir unnötig schwer



  • Wo willst du da WM_KEYDOWN abfangen? Die WM_KEYDOWN Message bekommt ja nur dein Edit Control. Wenn du das ganze ohne IsDialogMessage() machen willst, musst du jedes Editfeld Subclassen (heißt das so? ich meine die WndProc des Editfeldes gegen deine eigene Tauschen) und dir dann noch etwas überlegen, damit der ganze Kram Editübergreifend funktioniert (also solche Sachen wie welches Editfeld wird beim druck auf Tab als nächstes fokusiert).

    Am besten nimmst du einfach IsDialogMesssage und WS_TABSTOP, man brauch eigentlich nur 4-5 Minuten um das einzubauen. Wenn du die Tabreihenfolge der Editfenster verändern willst, musst du übrigens einfach die Reihenfolge der CreateWindow aufrufe entsprechend abändern.


Anmelden zum Antworten