Я сделал WxWidgets использовать форму wxFormBuilder, и я пытаюсь бросить событие колесика мыши на объект. Проблема в том, что событие не генерируется, поэтому я хотел бы спросить вас, должны ли быть какие-то дополнительные настройки. У объекта есть таблица событий, подобная этой
BEGIN_EVENT_TABLE(MyObj, wxScrolledWindow)
EVT_MOUSEWHEEL(MyObj::OnMouseWheel)
END_EVENT_TABLE();
И это инициализируется так:
myObjInstance = new MyObj(this, ID_MYOBJ, wxPoint(10, 10), wxSize(30,30), 0);
Я заметил, что в wxFormBuilder, когда добавили событие из GUI, функция подключения был использован, который сгенерировал этот вывод
myObjInstance ->Connect( wxEVT_MOTION, wxMouseEventHandler( MyFrame::TestMouseOnverTheEdit ), NULL, this );
но я не могу использовать его, так как моя функция-обработчик события OnMouseWheel находится в классе MyObj и защищена.
Я также сделал кадр с этим объектом и событием в Wxdev-C ++ и событие было брошено. Разница в том, что форма, созданная wxFormBuilder, имеет несколько классификаторов и панелей, тогда как форма в wxDev-C ++ не имеет их. Был аналогичная проблема решено, но я до сих пор не знаю, что мне делать. Благодарю.
Редактировать:
Подпись обработчика:
void OnMouseWheel(wxMouseEvent & AwxEvent);
«Проблема в том, что событие не брошено»
Я предполагаю, что событие действительно брошено. Ваша проблема в том, что он не пойман!
Вот некоторые вещи, которые вы должны изучить.
Ваши обработчики событий должны быть публичными.
Что такое MyObj? Это должна быть специализация wxFrame или другого стандартного окна wxWidgets.
BEGIN_EVENT_TABLE (MyObj, wxScrolledWindow)
Это означает, что MyObj является специализацией wxScrolledWindow. Если это не так, как вы предлагаете в своем комментарии, то таблица событий не будет работать, чтобы поймать события. http://wiki.wxwidgets.org/Events#Inheriting_Event_Tables_.28Events_in_Derived_Classes.29
Не ясно, используете ли вы таблицу событий или метод Connect (). Вы не можете использовать оба!
Если вы используете connect, вам нужно быть осторожным, чтобы использовать правильный объект для его вызова. Проще говоря, метод соединения в кадре, который сгенерировал событие, должен вызываться, а не объект, который обрабатывает событие. http://wiki.wxwidgets.org/Events#Using_Connect.28.29
Я нашел решение. Дело в том, что у меня была wxPanel (внутри основного кадра)
m_panel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
а затем я добавил myObj в приложение, как это:
myObjInstance = new MyObj(this, ID_MYOBJ, wxPoint(10, 10), wxSize(30,30), 0);
который не работал, поэтому я установил первый аргумент (родительское окно) в m_panel:
myObjInstance = new MyObj(m_panel , ID_MYOBJ, wxPoint(10, 10), wxSize(30,30), 0);
и теперь он работает нормально с таблицами событий.
Если вы используете Connect()
вам нужно указать wxEVT_MOUSEWHEEL
не wxEVT_MOTION
,