wxWidgets绑定示例

时间:2012-01-26 18:53:43

标签: c++ events wxwidgets

我正在使用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()函数。

1 个答案:

答案 0 :(得分:2)

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