当右键单击时,来自Menubar的Popupmenu
PopupMenu from MenuBar when right click
这是给我一个问题的代码:
void CMainFrame::DisplayActionsPopupMenu()
{
// get "Actions" menu
wxMenuBar* pMenuBar = GetMenuBar();
ASSERT(pMenuBar != NULL);
int nIndex = pMenuBar->FindMenu("Actions");
ASSERT(nIndex != wxNOT_FOUND);
wxMenu *pMenuActions = pMenuBar->GetMenu(nIndex);
ASSERT(pMenuActions != NULL);
// display a popup menu for actions
PopupMenu(pMenuActions);
}
我在这里尝试做的是在右键单击时显示一个弹出窗口,我希望它与我项目的梅巴尔的第二个菜单相同。
当我使用WXWIDGETS v2.8
编译时,它起作用现在我尝试使用v3.0,这是错误:
../src/common/menucmn.cpp(715): assert "!IsAttached()" failed in SetInvokingWindow(): menus attached to menu bar can't have invoking window
我该怎么办?
我认为,比脱离和附加菜单的现有答案更强大的解决方案是创建一个新菜单,例如这样的东西:
std::unique_ptr<wxMenu> CreateActionsMenu() { ... }
// In your frame ctor or wherever you initialize your menu bar.
MyFrame::MyFrame() {
wxMenuBar* const mb = new wxMenuBar;
mb->Append(CreateActionsMenu().release(), "&Actions");
SetMenuBar(mb);
}
// In your event handler function showing the popup menu.
void MyFrame::OnShowPopup(wxCommandEvent&) {
auto menu = CreateActionsMenu();
PopupMenu(menu.get());
}
创建菜单相对较快,在展示它之前,这样做应该没有问题(尽管当然,如果它真的很大或以其他方式构造,则可以将其缓存以备后用(。
<(最后,我发现使用> 3.0 wxwidgets 版本,您将无法从wxmenubar获得附加到框架的wxmenubar。因此,您必须暂时取消操作并重新纠正它。
这就是您的方式:
1-用梅纳巴尔初始化新的wxmenu。就我而言:
wxMenuBar* pMenuBar = GetMenuBar();
ASSERT(pMenuBar != NULL);
cout<<pMenuBar->IsAttached()<<endl;
int nIndex = pMenuBar->FindMenu("Actions");
ASSERT(nIndex != wxNOT_FOUND);
wxMenu *pMenuActions = pMenuBar->GetMenu(nIndex);
2-检查是否已附加:
if(pMenuActions->IsAttached()){
pMenuActions->Detach();
}
3-完成后,将wxmenu重新添加到wxmenubar
pMenuActions->Attach(pMenuBar);