C ++ Dynamic WX菜单绑定

时间:2012-09-08 00:43:45

标签: wxwidgets

我正在使用wxMenu,想要一种处理事件的方法。我真的只需要处理单击菜单项时发生的事件的东西。具体来说,给定一个任意函数指针(形式为void(*)(void)),我想让它在给定事件发生时调用该函数指针。

事先不知道菜单,所以我理解的事件表已经出来了。

我找到了Bind和Connect,但似乎都不起作用(另请参阅this for Connect)。

添加代码:

class Menu : public wxMenu {
    public:
        void handle_event(wxCommandEvent& event) {
            volatile int i = 6; //to prevent this method being optimized out
            //breakpoint here that never gets hit
            //selecting a callback to call (based on event.GetID()) could go here
        }
};

//Later, in a function (menu is instance of Menu)
menu->Connect(
    wxEVT_COMMAND_MENU_SELECTED,
    (wxObjectEventFunction)(&Menu::handle_event),
    NULL,menu
);
//Also tried:
menu->Bind(wxEVT_COMMAND_MENU_SELECTED,&(Menu::handle_event),menu);

2 个答案:

答案 0 :(得分:0)

您不能直接使用void (*)(void)签名绑定函数,因为Bind()期望事件处理程序为void (*)(EventClass&),其中EventClass取决于您所处事件的类型绑定到例如在你的情况下是wxCommandEvent

当然,你可以完全自由地使用boost.bindboost.lambda,C ++ 11 lambdas,或者只是将一个接受事件参数的函数的调用手动转发给一个不接受它的函数,所以使用Bind()应该可以正常使用。

答案 1 :(得分:0)

第一条评论:您的命名约定非常令人困惑:Menu是wxMenu的子类,并且有一个名为menu的实例。如果我必须维护这段代码,我会生气。

第二条评论:你在这里想要达到的目的是你不能用“正常”方式做到这一点?

正常方法是这样的:

向标准wxMenu类的实例添加选项

myMenu.Append(IDM_Option1,"Option 1");
...
myMenu.Append(IDM_OPtionN,"OPtion N");

绑定事件

   Bind( wxEVT_COMMAND_MENU_SELECTED, &myWindow::OnMenuEvent, this, 
            IDM_Option1, IDM_OptionN );

处理事件

  myWindow::OnMenuEvent( wxCommandEvent& event )
  {
      switch ( event.GetId() ) {
           case IDM_Option1
           ...

这可以处理大多数情况,而无需您继承wxMenu。