2012-01-26 35 views
2

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

回答

2

原來,編譯器在抱怨我使用的事件類型(wxCommandEvent)。當我將其更改爲wxTimerEvent時,版本#2開始工作。

+0

欣賞當你解決問題時回來回答的努力。 – ubuntugod