Fokus auf einen Button in einem modalen Dialog



  • Hallo,

    wie der Titel schon sagt möchte ich in einem modalen Dialogfeld nach dessen Erstellung den Fokus auf einen Button setzen. Wenn ich das nicht falsch verstanden hab macht man das doch in der OnInitDialog. Ich habs so implementiert:

    BOOL CEinstellung::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// TODO:  hier zusätzliche Initialisierung hinzufügen.
    	m_Startbutton= (CButton*)GetDlgItem(IDC_TESTEN_START);
    	m_Startbutton->SetFocus();
    
    	return FALSE;  // return TRUE unless you set the focus to a control
    	// AUSNAHME: OCX-Eigenschaftenseite muss FALSE zurückgeben.
    }
    

    Leider ist der Fokus trotzdem auf dem Ok-Button. Was mach ich da falsch?

    EDIT: selbst wenn ich den Button als ersten in der Tab-Reihenfolge habe ist trotzdem der Ok-Button der, der den Focus hat.... 😕
    Setze ich mit SetDefID(IDC_TESTEN_START) den Default-Button auf den Startbutton, so wird das zwar erst mal so übernommen, aber alle weiteren SetFocus-Aufrufe bleiben trotzdem unberührt davon.


  • Mod

    Das ist so richtig. Was geht nicht?
    Ich würde bei Buttons aber einfach auch den Default Button setzen.
    Dann funktioniert die Eingabe Taste auch wenn der Foxus nicht auf diesem Button liegt.

    (siehe CDialog::SetDefID)



  • Martin Richter schrieb:

    Das ist so richtig. Was geht nicht?

    Naja, nachdem man das Dialogfeld über DoModal aufruft, ist der Focus trotzdem auf dem Ok-Button. Tabreihenfolge ist: 1. Ok-Button, 2. Abbrechen-Button, 3. Startbutton, 4. Stopp-Button.
    Irgendwas scheint den Focus nach dem Aufruf in der OnInit wieder auf den Ok-Button zu legen.
    Ein

    BOOL CEinstellung::OnInitDialog()
    {
        CDialog::OnInitDialog();
    
        // TODO:  hier zusätzliche Initialisierung hinzufügen.
        GetDlgItem(IDOK)->EnableWindow(false);
        return FALSE;  // return TRUE unless you set the focus to a control
        // AUSNAHME: OCX-Eigenschaftenseite muss FALSE zurückgeben.
    }
    

    wird ja auch richtig ausgeführt. Sollte ich dann doch den 1. Tab. auf das gewählte Control (hier der Button setzen)? Aber irgendwie komisch ist das trotdem. Die OnInit returniert false und wird auch angesprungen und bereinigt sowie alles neu erstellt habe ich auch schon.


  • Mod

    Wenn der OK Button disabled wird musst Du einen anderen Defult Button definieren. Verwende doch mal SetDefID!

    Zudem könntest Du auch einfach die Tabfolge ändern unf IDOK ans Ende setzen. Der Ring der Controls bleibt ja identisch.



  • Martin Richter schrieb:

    Wenn der OK Button disabled wird musst Du einen anderen Defult Button definieren. Verwende doch mal SetDefID!

    Zudem könntest Du auch einfach die Tabfolge ändern unf IDOK ans Ende setzen. Der Ring der Controls bleibt ja identisch.

    Das hab ich gemacht, leider ohne Erfolg. Mit dem Disable wollte ich nur schauen, ob die OnInit richtig abgearbeitet wird. Wenn ich SetDefID (SetDefID(IDC_TESTEN_START)) verwende, dann bleibt der Focus permanent auf dem dann definierten Button. Ich muss aber, nachdem der Startbutton gedrückt wurde den Focus auf den Stoppbutton legen und den Startbutton deaktivieren. Drückt man dann auf den Stoppbutten soll das ganze umgedreht ablaufen. Jeder weitere SetFocus-Aufruf bleibt allerdings unberührt. Warum? Soweit ich weiß muss man duch nichts updaten...


  • Mod

    Kann es sein, dass Du Default-Button und Foxus verwechselst?



  • Martin Richter schrieb:

    Kann es sein, dass Du Default-Button und Foxus verwechselst?

    Nein, hab ich nicht verwechselt. Ich hab jetzt allerdings im Ressourceneditor bei allen Buttons, zwischen denen ich hin und herschalten will, die Eigenschaft "Standardschaltfläche" auf "True" gesetzt und jetzt gehts komischerweise. Das war mir echt neu...


  • Mod

    Das wäre aber nicht korrekt. Es sollte nur einen solchen Button geben!



  • Das dachte ich mir auch, aber nur so funktionierts. Ich mag auch nicht solche zusammengeflickten Lösungen. Aber hast du eine bessere Idee?



  • AndyDD schrieb:

    Martin Richter schrieb:

    Kann es sein, dass Du Default-Button und Foxus verwechselst?

    Nein, hab ich nicht verwechselt.

    Ich glaube doch. Willst du beeinflussen, welcher Button mit der Enter-Taste ausgelöst wird, oder welcher mit der Leertaste ausgelöst wird?



  • Ich will beim Starten des Dialoges den Focus auf einen Button (IDC_...) setzen, der nicht Ok- oder Abbrechen-Button ist. Dann soll beim Drücken der Enter-Taste das auch an den Button gehen der den Focus hat.
    Ich hab das mal in einem anderen Projekt hinbekommen, da habe ich allerdings die Buttons mit Create eingefügt (also nichts was aus der Ressource kommt). Leider finde ich es nicht mehr.
    Wenn ich den Default-Button auf diesen IDC_..., dann hab ich ein ähnliches Problem. Das Enter-Ereignis landet dann beim entsprechenden Button, allerdings kann ich dann nicht den Focus auf einen weiteren Button legen.
    Oder kann man auch zur Laufzeit die Zuordnung des Default-Buttons ändern?



  • AndyDD schrieb:

    Dann soll beim Drücken der Enter-Taste das auch an den Button gehen der den Focus hat.

    Die Entertaste löst aber nicht den Button aus, der den Fokus hat, sondern den Default-Button. Das ist das Standardverhalten von Dialogen unter Windows, davon solltest nicht ohne guten Grund abweichen.

    Mit dem Fokus hat dein Problem absolut nichts zu tun.



  • Ok, dann erst mal vielen Dank für den Hinweis. Hab ich zwar schon mal gehört, war mir aber so nicht recht bewusst.
    Aber wie bekommt man das in den Griff? Sollte man zur Laufzeit mit SetDefID den Default-Button ändern? Der Hintergrund ist der: das Programm soll auf einer Messmaschine laufen, wo der Bediener sehr wenig mit der Maus arbeiten will (also alles über Tab, Esc und Enter).

    MFK schrieb:

    Die Entertaste löst aber nicht den Button aus, der den Fokus hat, sondern den Default-Button. Das ist das Standardverhalten von Dialogen unter Windows, davon solltest nicht ohne guten Grund abweichen.

    Mit dem Fokus hat dein Problem absolut nichts zu tun.

    Aber wie erklärst du dann, dass es dennoch funktioniert, wenn man einmal mit der Maus den entsprechenden Button betätigt hat. Dann kann ich mit der Enter-Taste zwischen beiden Buttons hin und herspringen, obwohl der Default der Ok-Button ist.


  • Mod

    Wenn man mit der Tab-Taste hin und herspringt zwischen Button-s dann verändert sich der Default Button.
    Grundsätzlich wird bei Verwendnung von Tab ein Button zum Default-Button. Wird dagegen ein Edit Control angesprungen, dann wird der ursprüngliche Defualt Button wieder der Default Button.


Anmelden zum Antworten