wxWidgets绑定示例

问题描述:

我正在使用wxWidgets 2.9,并且遇到了绑定()函数的问题。该documentation为wxEvtHandler说wxWidgets绑定示例

void Bind (const EventTag &eventType, Functor functor, int id=wxID_ANY, int lastId=wxID_ANY, wxObject *userData=NULL) 

对我来说,这意味着我进入这样的事情

Bind(wxEVT_PAINT, &Board::onPaint); 

或本

Bind(wxEVT_TIMER, &TetrisController::onTimer, ID_TIMER); 

但既不在我的程序,这些工作的。 的wxWidgets还具有事件的explanation具有不同的格式:

Bind(wxEVT_COMMAND_MENU_SELECTED, &MyFrame::OnExit, this, wxID_EXIT); 
Bind(wxEVT_COMMAND_MENU_SELECTED, &MyFrameHandler::OnFrameExit, &myFrameHandler, wxID_EXIT); 

看来绑定()函数需要一个指针,它指向具有列出ID之前仿函数的对象。 我试过

Bind(wxEVT_PAINT, &Board::onPaint, this); // this points to the Board 
Bind(wxEVT_TIMER, &TetrisController::onTimer, controllerPtr, ID_TIMER); 

这些都不能工作。 我可以得到一个如何正确使用Bind()函数的例子吗?这个功能有什么问题?

编辑: 张贴更多的代码,希望得到答案。下面是我得到的错误信息:
版本#1

error: must use '.*' or '->*' to call pointer-to-member function in '((wxEventFunctorFunctor<wxEventTypeTag<wxPaintEvent>, void (tetris::Board::*)(wxPaintEvent&)>*)this)->wxEventFunctorFunctor<wxEventTypeTag<wxPaintEvent>, void (tetris::Board::*)(wxPaintEvent&)>::m_handler (...)', e.g. '(... ->* ((wxEventFunctorFunctor<wxEventTypeTag<wxPaintEvent>, void (tetris::Board::*)(wxPaintEvent&)>*)this)->wxEventFunctorFunctor<wxEventTypeTag<wxPaintEvent>, void (tetris::Board::*)(wxPaintEvent&)>::m_handler) (...)'| 

版本#2

error: no matching function for call to 'wxEventFunctorMethod<wxEventTypeTag<wxTimerEvent>, TetrisController, wxCommandEvent, TetrisController>::CheckHandlerArgument(wxTimerEvent*)' 
error: cannot convert 'Board*' to 'TetrisController*' in initialization 

我也试过

Bind(wxEVT_TIMER, &TetrisController::onTimer, this, ID_TIMER); // this points to the Board 

,我得到了第二个错误。我真的很想知道如何正确使用Bind()函数。

原来,编译器在抱怨我使用的事件类型(wxCommandEvent)。当我将其更改为wxTimerEvent时,版本#2开始工作。

+0

欣赏当你解决问题时回来回答的努力。 – ubuntugod