0

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

菜单不会提前知道,所以我理解的活动表已经出来了。

我找到了 Bind and Connect,但似乎都不起作用(另请参阅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);
4

2 回答 2

1

第一条评论:您的命名约定非常混乱: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。

于 2012-09-08T22:14:00.070 回答
0

您不能void (*)(void)直接绑定带有签名的函数,因为Bind()期望事件处理程序的void (*)(EventClass&)位置EventClass取决于您绑定到的事件的类型,例如wxCommandEvent在您的情况下。

当然,您可以完全自由地使用boost.bind, boost.lambda, C++11 lambdas,或者只是手动将调用从一个接受事件参数的函数转发到一个不接受它的函数,所以 usingBind()对您来说应该工作得很好。

于 2012-09-08T13:49:54.707 回答