Button-Vokus mit Tab-/Pfeiltaste wechseln??



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


  • Mod

    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?


  • Mod

    Nein. Der Button hat nicht den Fokus, sondern er ist der Deffault-Button, der durch VK_ENTER ausgelöst wird.


Anmelden zum Antworten