wxWidgets事件处理.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
wxWidgets不完全系列之--wxEvtHandler这里介绍wxWidgets中的一个非常重要的部分wxEvtHandler,很多人对这个也一直感到很困扰,希望这个对大家有所帮助. 大家都知道,windows的程序都是消息驱动的.在wxWidgets中,wxWindow是从wxEvtHandler继承的,所有GUI的消息都是wxEvtHandler来处理的,像大家经常用到的wxMouseEvent,wxKeyEvent,wxMenuEvent,wxPaintEvent等等.说wxEvtHander是GUI部分的核心一点不为过. 当一个消息事件到达一个对象时候,看看事件的处理流程(信息来自wxWidgets的帮助Event handling overview),消息都是在ProcessEvent函数中处理: 1.如果对象禁止事件处理的话(通过调用wxEvtHandler::SetEvtHandlerEnabled),直接跳到第六步. 2.如果对象是wxWindow,ProcessEvent会一直递归调用window的wxValidator.如果返回真,事件处理结束. 3.通过调用SearchEventTable函数来查找该消息事件,如果查找失败,会到对象的父类中查找的.直到找到符合的事件处理函数,事件处理结束. 4.把消息事件传递给事件处理链的下一个wxEvtHander,直到链中最后一个wxEvtHander,如果找到符合的事件处理函数,事件处理结束. 5.如果前面都失败了,则需要认真对待了:-).如果对象是wxWindow,并且消息是允许扩散传递的,ProcessEvent将会递归使用对象的parent window的wxEvtHander来处理事件,如果parent window处理了该消息,事件处理结束.什么消息是允许扩散传递的呢?在wxWidgets中还是非常容易判断的,如果事件是从wxCommandEvent继承下来的,就是允许的.这个会在后面详细说明. 6.最后的防线了,ProcessEvent将使用wxApp的wxEvtHander来处理事件. 好的,规则定好了,下面针对性的说一些具体的细节部分. 第一步: 太简单了:-),真不知道可以补充什么了. 第二步: 对wxValidator一点也不熟悉,也一直没有下决心去认真研究研究,在这里就先略过了:-(.希望以后能加上针对性的说明. 第三步: 一般来说,前面两步很多情况都可以直接忽略的,基本很少人会禁止自己的消息处理吧? 消息到了这里后,处理就很像MFC中的了.如果自己不显式处理的话,消息会在父类中处理的.如果自己处理的话,也要看看是否有需要父类也处理.在MFC中,如果想处理某消息,需要重载对应的虚函数,调用父类的消息处理函数来实现传递给父类处理的.例如: void MyButton::OnMouseDown(...) { ? ? ? ? ... ? ? ? ? CButton::OnMouseDown(...); } 最初wxWidgets也是使用的虚函数来实现消息处理的,但是从2.0开始,开始使用事件表来实现了.这个可能是很多人不熟悉的地方,特别是从MFC转过来的.例如想处理WM_SIZE消息,需要在事件表中定义对应的事件函数,如下: BEGIN_EVENT_TABLE(MyFrame, wxFrame) ? EVT_SIZE ? ?(MyFrame::OnSize) END_EVENT_TABLE() EVT_SIZE就是表示WM_SIZE消息,OnSize就是对应的处理函数了.具体的可以查看wxWidgets的帮助,有完整的事件表. 那如果在OnSize里自己处理完后该如何通知父类处理呢?因为现在是事件表了,不像虚函数,能明确的调用父类同名函数来实现.这里就有一个重要的函数:wxEvent::Skip(bool skip = true).为什么不是wxEvtHander的函数?我个人认为,wxEvtHander所有处理都是针对wxEvent的,wxEvent对象在整个消息周期都存在,而且一直从发送者传递给所有的消息处理者,是一个理想的状态携带者.可以看到默认是不在传递的,这样父类会丢失对事件的处理机会的,这个对像wxKeyEvent,wxMouseEvent是非常重要的,如果不让父类处理的话,那真不知道会有什么情况.当然有些特殊情况会要父类忽略某些消息,默认行为就能很好的完成任务了. 第四步: 什么是事件处理链呢?默认每个窗口都有自己的wxEvtHander,但是在wxWidgets中是可以重新设置的,并且可以添加更多监听者.相关函数是:wxWindow::SetEventHandle

文档评论(0)

中华书局 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档