wxMenu: Feststellen welches Ctrl das Contextmenü getriggert hat
-
Folgende Situation: Ich habe 2 TreeCtrls welche zum Teil Identische menüs besitzen, und diese Events will ich nun jeweils im selben Eventhandler haben.
Nun muss ich aber dort auch unterscheiden, von wem dieser Event kam, aber so richtig schein ich das im Eventhandler nicht zu können:tree1->Connect(ID_ACTIVATEPROJECT,wxEVT...,NULL,this); tree2->Connect(ID_ACTIVATEPROJECT,wxEVT...,NULL,this); void MyFrame::OnActivateProject(wxCommandEvent& e) { // tree 1 or 2 is now the question Wink }
Wie kann ich nun im Handler feststellen von wem der Event getriggert wurde?
e.GetId() und e.GetEventObject() liefern dies nicht.Gibts ne Möglichkeit dies zu tun?
Oder muss ich doch für jeden einen extra Handler implementieren?phlox
-
Hallo,
hatte ähnliches Problem. Die TreeCtrls sollten mit verschiedenen IDs erzeugt werden. Für jeden Tree gibt es im EVENT_TABLE einen eigenen Eintrag, verweisen aber beide auf die gleiche Methode. Dort bekommst Du mit "event.GetEventObject()" den Tree, der das Ereignis ausgelöst hat. Bei mir funktioniert das mit "wxButton". Falls es so bei dir nicht geht, liegt es vielleicht daran, das das Event nicht von der Treeview sondern vom Menü ausgelöst wird?
-
Ich hab ja bereits betont das GetEventObject das nicht liefert in diesem Fall.
Aber FindFocus scheint einen guten Wert zu liefern, da das TreeCtrl den Focus offenbar nicht dadurch verliert:
void codemodelGUIFrame::OnActivateProject(wxCommandEvent& e) { wxTreeCtrl* tree=0; wxWindow* focus = FindFocus(); if(focus == documenttree) tree = documenttree; else if(focus == filetree) tree = filetree; else return; wxTreeItemId sel = tree->GetSelection(); if(!sel.IsOk()) return; }
Allerdings braucht das TreeCtrl dafür den Focus, man muss also im OnClickHandler des TreeCtrls SetFocus aufrufen.
-
Wie erstellst du denn das Popup?
Wenn du einfach wxWindow::PopupMenu() verwendest: Das kehrt ja erst zurück, wenn das Popupmenu geschlossen wird. Also kannst du dort einfach eine Variable vor dem PopupMenu setzen und nach dessen Rückkehr wieder zurücksetzen. Beim Aufruf des Event-Handlers kannst du einfach diesen Wert abfragen.
-
Ja mit PopupMenu, aber der Handler liegt nicht im TreeCtrl. Sondern im Frame.
-
Ähhh, ja?
Ich nehme doch mal an, dass du zumindest beim PopupMenu() noch weisst, welcher der beiden Trees angeklickt wurde. Einfach hier diesen Wert in 'ner Member-Variable deines Frames speichern.
Die Event-Handler für die Menu-Items werden wohl im selben Frame sein, wie derjenige der beim Rechtsklick auf den Tree, der das Popup erstellt hat.
Also kannst du hier diese Member-Variable einfach abfragen. Und da PopupMenu() erst zurückkehrt, *nachdem* ein Item ausgewählt und das entsprechende Event verarbeitet wurde (oder das Menu anderweitig dismissed wurde), kannst du sicher sein, dass beim Aufruf des Menu-Klick-Mich-Events besagte Membervariable immernoch denselben Wert hat, wie damals als das Menu gepoppt wurde.
-
Ja, wäre eine möglichkeit, jeweils im TreeCtrl eine Variable zu haben, ob gerade ein PopupMenu läuft.
Allerdings funktionierts auch recht gut mit SetFocus, und daher werd ich es erstmal dabei belassen.phlox