2017-06-13 63 views
0

我使用wxToolBar这使得使用一个下拉菜单的用下面的代码(简化):wxToolBar与下拉菜单:上选择的项目没有反应

g_toolBar1->AddTool(TOOLBAR_CMD_CONTROL_DROPDOWN,_("Control elements"),MainWin::getBitmap(gearsXPM,"gears"),wxNullBitmap,wxITEM_DROPDOWN); 
custParent->Connect(TOOLBAR_CMD_CONTROL_DROPDOWN,wxEVT_COMMAND_TOOL_CLICKED,wxCommandEventHandler(DrawCanvasSwitcher::OnToolbar),NULL,g_drawCanvas); 

wxMenu *controlMenu=new wxMenu; 

// following is repeated several times to have more than onw drop-down item 
// (*it) is an iterator to an container holding the required data 
wxMenuItem *item=new wxMenuItem(controlMenu,wxID_ANY,(*it)->m_entityParams.m_name,(*it)->m_entityParams.m_shorthelp); 
controlMenu->Append(item); 
item->SetBitmap(*(*it)->m_entityParams.m_bmToolbar); 
item->SetId((*it)->m_wxID); 
custParent->Connect(item->GetId(),wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED,wxCommandEventHandler(DrawCanvasSwitcher::OnMenu),NULL,g_drawCanvas); 

g_toolBar1->SetDropdownMenu(TOOLBAR_CMD_CONTROL_DROPDOWN,controlMenu); 

g_toolBar1->Realize(); 

所以第一连接()是成功的并在单击顶部工具栏项时,我最终在DrawCanvasSwitcher :: OnToolbar()。第二个Connect() - 它只是从同一个文件中的不同位置复制而来,并且对于普通菜单项可以正常工作 - 不起作用,我从来没有在DrawCanvasSwitcher :: OnMenu()中选择一个工具栏下拉菜单项目。事件类型与wxWidgets 3.1附带的工具栏样例中使用的相同。 g_drawCancas和custParent全部都是有效的(并且适用于普通菜单项)。

那么,为什么我不会在单击的下拉项目上感受事件呢?

编辑:使用wxEVT_COMMAND_MENU_SELECTED代替wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED没有任何区别,仍然没有事件......

回答

1

我看不出有什么明显的错误代码,那么,一如既往,最好的事情会试图尽可能地简化它,或者尝试在工具栏示例中做同样的事情,以查看是否可以在那里重现问题。

我想尝试的一件事就是在创建菜单项时立即指定(*it)->m_wxID,而不是稍后设置它。它当然是应该是的书面工作,但这样做很不常见,所以也许在某处存在一个bug。

如果你设法重现工具栏样本中的问题(例如只是删除事件表条目MyFrame::OnToolDropdown()存在和使用Connect()代替),请不要report it作为一个bug,提您的平台。

最后,虽然这是完全无关,您的问题,我们实在没有理由去用Connect()代替Bind()与wxWidgets的3.x的,你真的应该切换到后者为更好的编译时的安全性和灵活性。

+0

通过SetId()设置ID是原因 - 当创建菜单项时,它可以顺利运行 - 谢谢!使用Connect()是因为此应用程序还需要在某些平台上进行编译,而我仍处于2.8版本中...... – Elmi