2016-10-13 1 views
0

Lassen Sie uns sagen, dass ich eine Gruppe von Radio-Elemente in einer wxMenu haben. Ich weiß, dass genau einer von ihnen zu jeder Zeit überprüft wird.Suchen eines wxMenu Selected Radio Item

Hält das wxMenu oder irgendein anderes Konstrukt den Index des überprüften Elements, oder muss ich das isChecked auf jedem Funkelement aufrufen, bis ich das überprüfte Element finde, um seinen Index zu finden?

Ich habe this question darüber gefragt, wie man das macht, aber ich würde viel lieber, dass wxWidgets mich davor bewahrt, das überall zu machen.

Antwort

1

Nein, den Index des zuletzt ausgewählten Elements speichern (wie in ravenspoint's answer gezeigt) oder unter Verwendung von wxMenuBarBase::IsChecked(), bis Sie die ausgewählten Radiobutton finden, ist der einzige Weg, es zu tun.

Damit wxWidgets Zugriff auf die aktuell ausgewählte Schaltfläche haben, müsste sie nicht nur gespeichert werden (was nicht zu vergessen bedeutet, nicht nur zu aktualisieren, wenn die ausgewählten Änderungen, sondern auch wenn Elemente in das Menü eingefügt/gelöscht werden) es ist schon nicht ganz trivial), aber irgendwie den Zugriff auf die Radio-Items-Gruppe zu ermöglichen, die Sie interessiert, die es erfordern würde, sie identifizieren zu können, und derzeit gibt es keine Möglichkeit, dies zu tun, und es wird nicht besonders sein einfach.

Was jedoch leicht, getan werden könnte, ist eine wiederverwendbare Funktion int GetIndexOfSelectedRadioItem(int firstItem) schreiben, die bei dem gegebenen Punkt beginnen würde und IsChecked() auf nachfolgende Artikel aufrufen, bis es true zurück und kehrt das von der Position versetzt. Sie sollten in der Lage sein, es in Ihrem eigenen Code zu tun, aber wenn Sie solche Funktion in wxWidgets selbst (als eine statische wxMenuBar Methode wahrscheinlich) einschließen möchten, zögern Sie bitte nicht, Patches/Pull-Anforderungen zu senden, es zu tun!

1

Es ist einfach genug, um Ihre eigenen zu rollen.

Binden Sie einen Ereignishandler für jede Schaltfläche an wxEVT_COMMAND_RADIOBUTTON_SELECTED. Extrahieren Sie im Handler die ID des ausgewählten Optionsfelds und speichern Sie sie dort.

So:

ResolMenu = new wxMenu(); 
    ResolMenu->AppendRadioItem(idRcvLoRez,"Low Resolution"); 
    ResolMenu->AppendRadioItem(idRcvMeRez,"Medium Resolution"); 
    ResolMenu->AppendRadioItem(idRcvHiRez,"High Resolution"); 
    ResolMenu->Check(idRcvLoRez, true); 
    Bind(wxEVT_MENU,&cFrame::onRcvRez,this,idRcvLoRez); 
    Bind(wxEVT_MENU,&cFrame::onRcvRez,this,idRcvMeRez); 
    Bind(wxEVT_MENU,&cFrame::onRcvRez,this,idRcvHiRez); 


void onRcvRez(wxCommandEvent& event) 
{ 
    myRezID = event.GetId(); 
+0

Ja, das ist meine aktuelle Lösung. Ich habe auf etwas Schöneres gehofft. –

Verwandte Themen