Fokus manuell setzen
-
Hallo,
ich habe eine MFC-Anwendung (Dialogfeldbasierend, kein SDI/MDI) und würde gerne manuell den Fokus auf ein anderes Element setzen, z.B. auf einen Button.
Wenn eine Eingabe aus einem Edit-Feld per <Enter> übernommen wird, will ich den Fokus auf einen Button setzen und nicht auf dem Edit-Feld lassen.
Wie kann ich das machen?
Von Delphi bin ich es gewohnt dass ich Buttons mit Name.Eigenschaft ansprechen kann, aber in MFC gibts ja keine Namen wenn ich das jetzt richtig verstanden hab. Nur die IDs und entsprechende Member-Variablen.
Gibt es eine Möglichkeit das in MFC zu machen? Ich Arbeite mit Visual C++ 6.0
Vielen Dank
-
Hallo !
In meinem Beispiel wird bei jedem Tastendruck der Fokus auf einen bestimmten Button gelegt (macht kein Sinn - dient nur als Beispiel) :
void CSetFocus_1Dlg::OnChangeEdit1() { ::SetFocus(m_Button1.m_hWnd); }
m_Button1 ist eine Membervariable des Buttons, der den Fokus bekommen soll. m_hWnd ist eine Eigenschaft des Buttons und gibt das WindowHandle dessen zurück.
Gruß Ernst
-
Ah, vielen Dank!
Der Code oben mit dem Handle ist mir nicht so ganz klar. Hat mir aber trotzdem weiter geholfen, die Sache mit der Membervariable des Buttons war der Entscheidende Tipp.
CButton m_BStell; .... m_BStell.SetFocus();
funktioniert einwandfrei. Und ist eigentlich ganz einfach
Dies setzt allerdings voraus, dass die Membervariable des Buttons/Edit-Controls/usw vom Typ Control ist. Wenn ich aber das Edit-Feld als CString definiere klappt das schon wieder nichtmehr, da ich dann die Eigenschaften nichtmehr aufrufen kann und pro Steuerelement nur eine Membervariable festlegen kann, wenn ich das jetzt richtig verstanden hab
-
MacReeg schrieb:
void CSetFocus_1Dlg::OnChangeEdit1() { ::SetFocus(m_Button1.m_hWnd); }
Um Gottes Willen, ich bin ja nicht gläubig, aber trotzdem ^^
CButton::SetFocus macht zwar nicht viel anderes, aber wenn man die MFC benutzt, dann bitte auch die entsprechenden Funktionen und nicht WINAPI und MFC durcheinander ^^@saibot83
Gut, dass du dir mal die MSDN zur Hand genommen hast. Da findet man seeeehr viele nützliche Informationensaibot83 schrieb:
Dies setzt allerdings voraus, dass die Membervariable des Buttons/Edit-Controls/usw vom Typ Control ist. Wenn ich aber das Edit-Feld als CString definiere klappt das schon wieder nichtmehr, da ich dann die Eigenschaften nichtmehr aufrufen kann und pro Steuerelement nur eine Membervariable festlegen kann, wenn ich das jetzt richtig verstanden hab
Wer hat dir eingeredet, dass es immer nur eine Membervariable pro Steuerelement gibt? Der Assistent kann bis zu 2 Verwalten (kommt auf das Steuerelement an), eine Value- und eine Controllvariable. Selber kann man dagegen so viele hineinsetzen wie man will, was allerdings im allgemeinen gar nicht nötig ist ^^
Und um es nun noch hinzusetzen, die Lösung ist in einem Dialog falsch oder nicht sauber oder wie man es auch nennen will. In einem Dialog sollte man die Funktion CDialog::GotoDlgCtrl benutzen. Der CWnd-Zeiger kann durch die Control Variable übergeben werden. Alle Controlklassen zu den Steuerelement sind ja von CWnd abgeleitet. Dadurch kann man einfach die Adresse auf eine entsprechende Controlvariable übergeben. Wenn man allerdings die Controllvariable nur dafür braucht, ist es auch nicht sonderlich sinnvoll. Dann gibt es noch CWnd::GetDlgItem, was in CDialog ja auch enthalten ist, da CDialog von CWnd abgeleitet ist. Bei CWnd::GetDlgItem gibt man die ID des Steuerelementes an und bekommt dafür den Pointer auf das CWnd Objekt.
Und noch nen Beispielcode mit CWnd::GetDlgItem, wobei ID_EDIT_ENTRY die ID von einem Editfeld ist.
// Wir befinden uns irgendwo in einer Memberfunktion von unserer Dialogklasse GotoDlgCtrl(GetDlgItem(ID_EDIT_ENTRY));
Grüssli
-
das nenn ich ja mal ne perfekte Erklärung
Danke!!
Werd ich nachher gleich so probieren