2017-06-13 73 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