我正在使用wxWidgets 2.9而我遇到了Bind()函数问题。 wxEvtHandler的documentation说
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()函数需要指向具有仿函数的对象的指针。 我试过了
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()函数。
答案 0 :(得分:2)
原来,编译器抱怨我正在使用的事件类型(wxCommandEvent)。当我将其更改为wxTimerEvent时,版本#2开始工作。