1

我已经使用wxFormBuilder制作了一个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 添加一个事件时,使用了函数 Connect来生成这个输出

myObjInstance ->Connect( wxEVT_MOTION, wxMouseEventHandler( MyFrame::TestMouseOnverTheEdit ), NULL, this );

但我不能使用它,因为我的事件处理函数 OnMouseWheel 在 MyObj 类中并且它受到保护。

我还在wxDev-C++中用这个对象和事件制作了一个框架,并引发了事件。不同之处在于 wxFormBuilder 创建的表单有多个尺寸器和面板,而 wxDev-C++ 中的表单没有。解决了类似的问题,但我仍然不知道该怎么办。谢谢。

编辑:处理程序的签名:

void OnMouseWheel(wxMouseEvent & AwxEvent);
4

3 回答 3

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 方法,而不是调用正在处理事件的对象。 http://wiki.wxwidgets.org/Events#Using_Connect.28.29

于 2012-10-04T16:03:38.440 回答
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); 

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

于 2012-10-08T12:44:59.570 回答
0

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

于 2012-10-05T12:42:13.303 回答