自定义事件继承 wxEvent 需注意的问题

这是wxWidgets论坛的中文版本。在这里,您可以用您的母语汉语讨论上面任一子论坛所涉及的所有关于wxWidgets的话题。欢迎大家参与到对有价值的帖子的中英互译工作中来!
Post Reply
ChunJiu
Knows some wx things
Knows some wx things
Posts: 35
Joined: Thu Jun 05, 2014 2:52 pm

自定义事件继承 wxEvent 需注意的问题

Post by ChunJiu » Sat Jul 12, 2014 8:32 pm

学习日志 2014.7.13

自定义事件有个容易忽略的重要问题:参数的顺序!

请看 wxEvent 构造函数的原型定义:
wxEvent (int id=0, wxEventType eventType=wxEVT_NULL)

再看看其它事件类型的定义:

Code: Select all

wxFocusEvent (wxEventType eventType=wxEVT_NULL, int id=0) 
wxCloseEvent (wxEventType commandEventType=wxEVT_NULL, int id=0)
wxClipboardTextEvent (wxEventType commandType=wxEVT_NULL, int id=0)
是的,变量 wxEventType 和 id 的位置是反的 !

由于在类声明中的构造函数上使用了缺省值,所以继承于 wxEvent 的新事件类若只使用一个参数来创建实例的话,实际上是只定义了一个 ID,而不是 wxEventType。我最初没注意,直接按照 wxEvten 的原型抄了,请看下面的例子:

class DataPackEvent : public wxEvent
{
public:
DataPackEvent( int id = 0, wxEventType eventType = wxEVT_NULL ):wxEvent(id, eventType){}
......
}

结果随后的代码中发送这个事件的时候,导致 wxEventType 是错误的,接收方死活也无法识别事件而直接抛弃,导致接收对象一直收不到事件数据!请看下面的例子:

发送事件的代码:
wxQueueEvent(parent_caller, new DataPackEvent(EVT_DATA_PACK));
实际上是等同于:
wxQueueEvent(parent_caller, new DataPackEvent( id=EVT_DATA_PACK , wxEventType=wxEVT_NULL) );
而期望的是:
wxQueueEvent(parent_caller, new DataPackEvent( wxEventType=EVT_DATA_PACK , id=0) );

所以一个小小的疏忽,导致一天的劳累......最后总算找到问题了!解决很容易,在定义的事件类中将两个变量的位置对调一下。请注意,其它的大多数常见类已经是正常顺序了,继承它们的时候最好要留意一下。

class DataPackEvent : public wxEvent
{
public:
DataPackEvent( wxEventType eventType = wxEVT_NULL, int id = 0 ):wxEvent(id, eventType){}
......
}

ollydbg23
Filthy Rich wx Solver
Filthy Rich wx Solver
Posts: 200
Joined: Fri Dec 12, 2008 10:31 am

Re: 自定义事件继承 wxEvent 需注意的问题

Post by ollydbg23 » Sun Jul 20, 2014 4:09 am

wxEventType好像就是int类型吧。我以前也犯过类似的错误。

ChunJiu
Knows some wx things
Knows some wx things
Posts: 35
Joined: Thu Jun 05, 2014 2:52 pm

Re: 自定义事件继承 wxEvent 需注意的问题

Post by ChunJiu » Sun Jul 20, 2014 4:50 pm

ollydbg23 wrote:wxEventType好像就是int类型吧。我以前也犯过类似的错误。
是的,所以编译器没警告......

Post Reply