使用wxwidgets在C ++中没有抛出事件

时间:2012-10-04 15:42:17

标签: c++ events wxwidgets

我使用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);

3 个答案:

答案 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

答案 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