2012-10-04 16 views
1

我做了一个wxwidgets表格使用wxFormBuilder,我试图抛出mousewheel事件的对象。问题是事件没有被抛出,所以我想问你是否应该有一些额外的设置。该对象具有事件表这样事件不会抛出C++与wxwidgets

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

回答

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

现在它可以与事件表一起使用。

1

“问题是事件不会抛出,”

我想象中的事件确实引发。你的问题是它没有被抓住!

以下是您需要了解的一些事项。

  1. 您的事件处理程序应该是公开的。

  2. 什么是MyObj?它应该是wxFrame或其他标准wxWidgets窗口的专门化。

    BEGIN_EVENT_TABLE(MyObj中,wxScrolledWindow)

    这意味着MyObj中是wxScrolledWindow的特殊化。如果不是,就像您在评论中所建议的那样,那么事件表将无法用于捕捉事件。 http://wiki.wxwidgets.org/Events#Inheriting_Event_Tables_.28Events_in_Derived_Classes.29

  3. 不清楚您是使用事件表还是Connect()方法。你不能同时使用!

  4. 如果确实使用connect,则需要小心使用正确的对象来调用它。简而言之,需要调用生成事件的框架上的connect方法,而不是处理事件的对象。 http://wiki.wxwidgets.org/Events#Using_Connect.28.29

+0

谢谢您的回复。 1.我使OnMouseWheel方法公开并尝试了myObjInstance - > Connect(wxEVT_MOTION,wxMouseEventHandler(MyObj :: OnMouseWheel),NULL,this);没有变化,或者Connect与它无关? 2. MyObj是一个特殊的对象,它不在标准的wxWidgets库中,但不应该是这个问题,因为正如我之前写的,当该窗体由wxDev-C++创建时,监听器为这个对象工作。 3.签名是你所说的,void OnMouseWheel(wxMouseEvent&AwxEvent); – DropDropped

+0

我没有注意到你回复了我,因为你刚刚编辑了你的帖子。无论如何,我会回复修改的问题编号2. - MyObj扩展了wxScrolledWindow,我没有建议它不。我已经说过两次了,它的监听器在wxDev-C++生成图形用户界面(我也在使用事件表)时工作。 3.起初我不知道我不能使用事件表和Connect()。这应该是全部,谢谢你的时间。 – DropDropped

0

如果使用Connect()你需要指定wxEVT_MOUSEWHEEL,不wxEVT_MOTION