[wx] Events empfangen
-
Hi, ich möchte gerne Plugins schreiben können die teilweise zu meiner GUI beitragen können.
Dies funktioniert auch soweit dass ich z.B.
setMenu(wxMenu* pluginMenu)
in der dll aufrufe und dann dem Menu einträge hinzufügen kann. Jetzt frage ich mich wie ich den rausfinden kann ob dieser neu erstellte Eintrag angeklickt wird etc. um dann weiter zu verfahren.Anscheinend gibt es genau für solche zwecke dynamische oder pluggable event handler aber mir ist jetzt noch nicht gelungen in irgendwelcher Weise Erfolg zu verbuchen. Momentan habe ich die Klasse, welche die Events innerhalb der dll empfangen soll von wxEventHandler abgeleitet ist. Somit bin ich auf jedenfall schon in der Lage compilefähigen Code zu schreiben der wahrscheinlich vom Ansatz her nicht total falsch liegt. (hoffe ich :D)
PLUGIN_API virtual const void setMenu(wxMenu* pluginMenu) const { const int id = ::wxNewId(); pluginMenu->Append( id, wxT("&Eintrag"), wxT("Eintrag") ); pluginMenu->Connect(id, wxEVT..., wxCommandEventHandler(PlugA::OnMenuClick)); //??? so ca. versuch ich es momentan }
Nun wäre die Frage wie ich in solch einem Fall den Click auf den Eintrag abfangen kann.
-
In der Theorie müsstest du jetzt noch die EventSink übergeben:
Connect(id,wxEVT.,wxCommandEventHandler(...),0,mysink);
-
Dank dir, ich hab das nun mal so versucht aber schein dabei auch keinen Erfolg zu haben.
habs nun so versucht
pluginMenu->Connect(id, wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction)&PlugA::OnAbout, 0, (wxEvtHandler *)this);
Allerdings versteh ich wohl das ganze konstrukt nicht.
-
wxEVT_COMMAND_BUTTON_CLICKED
^Das ist auch Menu Event
-
no way .... ich versteh die Technik bisher einfach net. Steh wohl auf dem Schlauch oder es geht net.
-
wxEVT_COMMAND_MENU_SELECTED
^Versuchs damit mal.
-
Ne das will auch nicht, ich werd mal das gleiche Szenario ohne dll nachbaun um das wenigstens auszuschliessen.
-
So! Ich hab es nun hinbekommen, obwohl mir nicht gänzlich klar ist wieso es sich so verhält. Obwohl ich eine Vermutung habe.
Übergebe ich der Klasse in der dll den frame der meine menubar enthält und nicht das menu kann ich wie folgt abgehn.
if(!frame) return; wxMenuBar* mbar = frame->GetMenuBar(); wxMenu* fileMenu = new wxMenu( wxT("") ); const int id = ::wxNewId(); //id für den eintrag fileMenu->Append( id, wxT("&Op2en\tCtrl+O"), wxT("Open existing file") ); //eintrag ins menu mbar->Append( fileMenu, wxT("&File2") ); //menu in die bar frame->Connect(id, wxEVT_COMMAND_MENU_SELECTED ,wxCommandEventHandler(PlugA::OnAbout); //event
-
Würde aber so belassen, das ist das dynamischere der mögl. Lösungen des Problems.
rya.
-
Der Event sink scheint wohl doch wichtig zu sein.
Ich hatte ohne die Angabe jetzt tierische Probleme korrekt auf member variablen meiner dll klasse zuzugreifen.Falls es jemand benötigen sollte, hier wäre der Thread den ich im wxWidgets Forum dazu aufgemacht habe.