我使用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添加事件时,使用function Connect生成此输出
myObjInstance ->Connect( wxEVT_MOTION, wxMouseEventHandler( MyFrame::TestMouseOnverTheEdit ), NULL, this );
但我无法使用它作为我的事件处理函数OnMouseWheel在类MyObj中并且它受到保护。
我还在wxDev-C++中使用此对象和事件创建了一个框架,并抛出了该事件。区别在于wxFormBuilder创建的表单有多个sizer和面板,而wxDev-C ++中的表单没有。有similar problem解决了,但我仍然不知道该怎么做。感谢。
编辑: 处理程序的签名:
void OnMouseWheel(wxMouseEvent & AwxEvent);
答案 0 :(得分:1)
“问题是没有抛出事件”,
我想这事件确实被抛出了。你的问题是它没有被抓住!
以下是您需要了解的一些事项。
您的事件处理程序应该是公开的。
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,则需要小心使用正确的对象来调用它。简单来说,需要调用生成事件的帧上的connect方法,而不是处理事件的对象。 http://wiki.wxwidgets.org/Events#Using_Connect.28.29
答案 1 :(得分:1)
我找到了解决方案。问题是,我有一个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);
现在它适用于事件表。
答案 2 :(得分:0)
如果您使用Connect()
,则需要指定wxEVT_MOUSEWHEEL
,而不是wxEVT_MOTION
。