Button-Vokus mit Tab-/Pfeiltaste wechseln??
-
Hallo,
ich hab in meiner Oberfläche mehrere Buttons und Edit-Felder. Jetzt meine Frage:
Wie kann ich einstellen, dass ich den Vokus per Tab wechseln kann, und mit ENTER der vokusierte Button gedrückt wird?Sorry, ist wahrscheinlich eine ganz einfache Sache, aber ich steig nicht dahinter.

Vielen Dank für eure Hilfe.
Gruß D_Lar
-
Das Ding heisst "Fokus".
-
UUps, hast recht EOutOfResources. Mann ist das peinlich!!

Kannst du mir auch bei meinem Programmier-Problem helfen?
-
Wie machst du die Oberfläche denn? Ich dachte, wenn man WinAPI mit der Oberfläche beauftragt, wird das mit dem Fokus automatisch geregelt.
-
das habe ich auch gehofft, allerdings funktioniert das bei mir nicht. Muss ich spezielle Fenstereinstellungen benutzen? z.B. bei CreateWindow(...)?
-
Versuch mal dem Button
WS_TABSTOPals Style zu setzen:CreateWindow( _T("BUTTON"), _T("Click Me!"), WS_TABSTOP /* accessible with the tab-key */ | WS_VISIBLE | WS_CHILD, 20 /* x */, 20 /* y */, 100 /* w */, 24 /* h */, hWnd, NULL, hInst, NULL );Gut Schuß
VuuRWerK
-
Vielen Dank VuuRWerk,
hab mal WS_TABSTOP zu allen Buttons hinzugefügt, aber es klappt immer noch nicht.

Beispiel für einen Button:
HWND StartStopButton; StartStopButton = CreateWindow( TEXT("button"), //Startet, stopt TEXT("Start"), WS_VISIBLE | WS_CHILD | WS_TABSTOP, 10,50,80,25, hWnd, (HMENU) 1, NULL, NULL );Was mache ich falsch???
-
Du könntest noch versuchen das BN_NOTIFY Flag in den Styles zu setzen. Da es bspw. notwendig ist wenn man den Focus programatisch setzen will mit BN_SETFOCUS. Allerdings sollte es schon von vornherein automatisch funktionieren das man mit der Tab-Taste durch die Controls navigieren kann, Komisch das es bei Dir nicht funktioniert ...
Gut Schuß
VuuRWerK
-
Das Handling der Tab-Taste wird durch die Funktion IsDialogMessage in der Message-Loop bereit gestellt.
-
Vielen Dank für eure Beiträge,
ich hab jetzt IsDialogMessage folgendermaßen eingebunden:
// Hauptmeldungsschleife: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { IsDialogMessage(msg.hwnd,&msg); //TranslateMessage(&msg); //DispatchMessage(&msg); }}Wenn ich jetzt TAB drücke, wird der erste Button ausgewählt, aber ich kann ihn weder mit Enter drücken, noch mit erneutem TAB wechseln.

Wenn ich das BN_NOTIFY Flag in den Styles setze, werden die Buttons automatisch gedrück, wenn ich also per maus drauf klicke, wird der Button 2 mal gedrückt. Ich muss sagen, jetzt bin ich langsam verzweifelt, vor allem wenn hier alle sagen, dass diese Tab-Navigation automatis funktioniert.
-
OK, ich habe bemerkt,dass es so nicht funktioniert. So kann ich nix mehr in die Edit-Fenster eingeben.
Ich gebe ja zu, das dies mein erstes Programm mit VisualC++ ist. Kann es sein, dass ich die automatische Tab-Kontrolle versehentlich gekillt oder ausgeschaltet hab?
-
Wie hast Du Dein erstes Programm erstellt?
Anhand eines Tutorials oder auf gut Glück?Nun, ich gehe mal stillschweigend davon aus, daß Du ein Dialog mit diesen Buttons und Edit-Feldern erstellen willst?
Wenn ja, zeig mal bitte Deine Resource-Datei (die mit der Endung ".rc")Ein versehentliches "Killen" der automatischen Tab-Kontrolle gibt es nicht (bei Dialogen).
Wenn doch, dann hast Du höchstwahrscheinlich ein völlig falsches Konzept angewendet.Ich habe damals mein erstes Programm mit Hilfe des Buchs "Windows-Programmierung" von Charles Petzold erstellt.
Dort werden auch viele kleine Eigenheiten bei der Windows-Programmierung erklärt, wie eben auch Dein Problem mit den Tab-Sprüngen, Fokus und Default-Buttons.
Das Buch kann ich einem Einsteiger nur empfehlen.HTH
Martin
-
Wenn du nur einen Dialog hast, dessen Handle mit null initialisiert ist, kannst du Folgendes machen
while (GetMessage (&msg, NULL, 0, 0)) { if (Dlg == 0 || !IsDialogMessage (Dlg, &msg)) // Dlg ist das Handle { if (!TranslateAccelerator (hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } }Bei Fenstern und mehreren Dialogen bietet sich Folgendes an
while (GetMessage (&msg, NULL, 0, 0)) { HWND FGWnd = GetForegroundWindow(); if(!IsDialogMessage(FGWnd,&msg)) { if(TranslateAccelerator(FGWnd, hAccelTable, &msg)) { continue; } TranslateMessage(&msg); DispatchMessage(&msg); } }
-
_Falke schrieb:
Bei Fenstern und mehreren Dialogen bietet sich Folgendes an
while (GetMessage (&msg, NULL, 0, 0)) { HWND FGWnd = GetForegroundWindow(); if(!IsDialogMessage(FGWnd,&msg)) { if(TranslateAccelerator(FGWnd, hAccelTable, &msg)) { continue; } TranslateMessage(&msg); DispatchMessage(&msg); } }_Falke, du bist mein Held!!!
Jetzt funktioniert es!! Ich kann jetzt mit Tab oder Pfeiltasten zwischen den Buttons in meinem Fenster wechseln.Wenn ich allerdings mit in ein Edit-Feld springe, hat automatisch einer der Buttons den Fokus. Warum das? und kann man den automatischen Fokus auf einen anderen Button setzen?
-
Nein. Der Button hat nicht den Fokus, sondern er ist der Deffault-Button, der durch VK_ENTER ausgelöst wird.