0

私はwxMenuを使用していて、イベントを処理する方法が必要です。メニュー項目をクリックしたときに発生するイベントを処理するものだけが本当に必要です。具体的には、任意の関数ポインター(void(*)(void)の形式)を指定して、指定されたイベントが発生したときにその関数ポインターが呼び出されるようにします。

メニューは事前にわからないので、私が理解しているイベントテーブルは出ています。

Bindと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と呼ばれるインスタンスがあります。このコードを維持しなければならないとしたら、私は怒ってしまいます。

2番目のコメント:これを行う「通常の」方法ではできないことを、ここで正確に何を達成しようとしていますか?

通常の方法は次のようなものです。

標準の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&)EventClasswxCommandEvent

Of course, you're completely free to use boost.bind, boost.lambda, C++11 lambdas or just manually forward the call from a function taking an event argument to one not taking it, so using Bind() should work just fine for you.

于 2012-09-08T13:49:54.707 に答える