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开始工作。
欣赏当你解决问题时回来回答的努力。 – ubuntugod