如何将wxToolbook选项正确绑定到菜单OptionA?
问题分析与解决方案
你的代码核心问题是没有给菜单栏的"A"菜单添加具体的菜单项,导致点击"A"菜单时没有可触发ID_OptionA事件的入口。另外还存在重复绑定事件的冗余代码,需要一并清理。
具体修改步骤
1. 给"A"菜单添加可触发事件的菜单项
在创建menuOptionA后,添加一行代码给它增加带ID_OptionA的菜单项:
wxMenu *menuOptionA = new wxMenu; wxMenu *menuOptionB = new wxMenu; // 添加这行代码 menuOptionA->Append(ID_OptionA, _("显示A标签"), _("点击显示A1和A2标签页")); menuBar->Append(menuOptionA, "&A"); menuBar->Append(menuOptionB, "&B");
2. 清理重复的事件绑定
你的代码同时使用了事件表和Bind函数绑定了ID_OptionA的事件,这会导致事件触发时重复执行逻辑,需要删除其中一套绑定:
- 如果你想保留事件表的方式,删掉构造函数里的这段Bind代码:
Bind(wxEVT_MENU, [&](wxCommandEvent& event) { tabControl1->AddPage(tabA1, "A1", true, 0); tabControl1->AddPage(tabA2, "A2", false, 1); }, ID_OptionA); - 如果你想保留Bind的lambda方式,删掉事件表中的注册代码:
// 从wxBEGIN_EVENT_TABLE和wxEND_EVENT_TABLE之间删掉这行 EVT_MENU(ID_OptionA, MyFrame::onOptionA)
3. 可选优化:给wxToolbook添加实际图片(避免标签显示异常)
当前代码只创建了ImageList但没有添加图片,wxToolbook的标签可能显示异常,你可以添加默认图标或者自定义图片:
// 以Windows为例,创建ImageList后添加默认图标 wxImageList* imgList = new wxImageList(16,16); imgList->Add(wxArtProvider::GetBitmap(wxART_INFORMATION, wxART_OTHER, wxSize(16,16))); imgList->Add(wxArtProvider::GetBitmap(wxART_WARNING, wxART_OTHER, wxSize(16,16))); tabControl1->SetImageList(imgList);
修改后的核心代码片段示例
MyFrame::MyFrame() : wxFrame(nullptr, wxID_ANY, "MyPrj") { // 图片列表优化(可选) wxImageList* imgList; if (wxPlatformInfo::Get().GetOperatingSystemFamilyName() == "Windows") imgList = new wxImageList(16, 16); else if (wxPlatformInfo::Get().GetOperatingSystemFamilyName() == "Macintosh") imgList = new wxImageList(32,32); else imgList = new wxImageList(24, 24); // 添加默认图标 imgList->Add(wxArtProvider::GetBitmap(wxART_INFORMATION, wxART_OTHER, imgList->GetSize())); imgList->Add(wxArtProvider::GetBitmap(wxART_WARNING, wxART_OTHER, imgList->GetSize())); tabControl1->SetImageList(imgList); // ... 其他菜单创建代码 ... wxMenu *menuOptionA = new wxMenu; wxMenu *menuOptionB = new wxMenu; // 添加菜单项 menuOptionA->Append(ID_OptionA, _("显示A标签"), _("点击显示A1和A2标签页")); menuBar->Append(menuOptionA, "&A"); menuBar->Append(menuOptionB, "&B"); SetMenuBar( menuBar ); // ... 其他Bind代码 ... // 保留其中一种事件绑定方式即可,比如保留事件表的话就删掉下面这段Bind // Bind(wxEVT_MENU, [&](wxCommandEvent& event) { // tabControl1->AddPage(tabA1, "A1", true, 0); // tabControl1->AddPage(tabA2, "A2", false, 1); // }, ID_OptionA); }
内容的提问来源于stack exchange,提问作者Raphael10
相关产品推荐
相关产品推荐

