wxWidgets绑定示例

3

我正在使用wxWidgets 2.9,但Bind()函数出了问题。wxEvtHandler的文档中提到:

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);

看起来Bind()函数需要在列出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()函数。

1个回答

4

事实证明,编译器抱怨我使用的事件类型是 wxCommandEvent。当我将其更改为 wxTimerEvent 时,版本 #2 开始正常工作。


感谢你解决问题后回来回答的努力。 - ubuntugod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接