Пример связывания wxWidgets - PullRequest
       25

Пример связывания wxWidgets

2 голосов
/ 26 января 2012

Я использую 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 также есть объяснение событий, которые имеют другой формат:

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

Кажется, функция 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 Ответ

2 голосов
/ 27 января 2012

Оказывается, компилятор жаловался на тип события, которое я использовал (wxCommandEvent). Когда я изменил его на wxTimerEvent, версия # 2 начала работать.

...