Button-Vokus mit Tab-/Pfeiltaste wechseln??
-
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.