2016-10-13 2 views
0

Предположим, что у меня есть группа радиостанций в wxMenu. Я знаю, что точно один из них будет проверен в любой момент времени.Найти выбранную радиостанцию ​​wxMenu Пункт

Содержит ли wxMenu или какой-либо другой конструкции индекс, указанный в элементе, или мне нужно вызвать isChecked на каждый элемент радиосвязи, пока я не найду элемент checked, чтобы найти его индекс?

Я спросил this question о том, как это сделать, но я бы предпочел, чтобы wxWidgets спас меня от этого.

ответ

1

Нет, спасая индекс последнего выбранного элемента (как показано на ravenspoint's answer) или с помощью wxMenuBarBase::IsChecked(), пока не найдете кнопку выбранного радио это единственный способ сделать это.

Для wxWidgets, чтобы обеспечить доступ к выбранной в данный момент кнопке, необходимо будет не только его сохранить (что означает не забывать обновлять не только при выбранных изменениях, но также и когда элементы вставляются в/удаляются из меню, поэтому это уже не совсем тривиально), но чтобы каким-то образом предоставить доступ к интересующей вас группе радиопомех, что потребует возможности идентифицировать ее, и в настоящее время нет способа сделать это, и добавление ее не будет особенно просто.

Что можно сделать легко, однако, пишет многоразовую функцию int GetIndexOfSelectedRadioItem(int firstItem), что бы начать в данном пункте и вызывать IsChecked() на последующих пунктах, пока она не возвращает истину и возвращает смещение элемента. Вы должны иметь возможность сделать это в своем собственном коде, но если вы хотите включить такую ​​функцию в сам wxWidgets (возможно, как статический метод wxMenuBar), пожалуйста, не стесняйтесь посылать исправления/тянуть запросы!

1

Слишком легко катиться самостоятельно.

Привяжите обработчик события к wxEVT_COMMAND_RADIOBUTTON_SELECTED для каждой кнопки. В обработчике извлеките идентификатор выбранного переключателя и сохраните его где-нибудь.

Как это:

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

Да, это мое текущее решение. Я надеялся на что-то более красивое. –

Смежные вопросы