查找 wx菜单的选定单选项

Finding a wxMenu's Selected Radio Item

本文关键字:选项 单选项 wx 菜单 查找      更新时间:2023-10-16

假设在wxMenu中有一组单选项。我知道,在任何给定的时间,这些选项中只有一个会被检查。

wxMenu或其他结构是否保留已检查项的索引,或者我是否需要在每个无线电项上调用isChecked,直到我找到已检查的元素以找到它的索引?

我已经问过this question关于如何做到这一点,但我更喜欢wxWidgets使我免于到处这样做。

不,保存最后选中项目的索引(如ravenpoint的答案所示)或使用wxMenuBarBase::IsChecked()直到找到选中的单选按钮是唯一的方法。

wxWidgets提供访问当前选中的按钮不仅需要存储它(这意味着不仅不能忘记更新时选择的变化,而且当物品插入/删除菜单,所以它已经不完全微不足道),但以某种方式提供收音机你感兴趣的项目小组,需要能够识别它,目前没有方法和添加它不会特别简单。

然而,

可以很容易地做的是编写一个可重用的函数int GetIndexOfSelectedRadioItem(int firstItem),它将从给定的项目开始,并对后续的项目调用IsChecked(),直到返回true并返回项目的偏移量。你应该能够在你自己的代码中做到这一点,但是如果你想在wxWidgets本身中包含这样的函数(作为一个静态wxMenuBar方法,可能),请不要犹豫,发送补丁/拉请求做它!

很容易自己动手。

为每个按钮绑定一个事件处理器到wxEVT_COMMAND_RADIOBUTTON_SELECTED。在处理程序中,提取选中的单选按钮的ID并将其存储在某处。

:

    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();