博客
关于我
wxWidgets源码分析(3) - 消息映射表
阅读量:471 次
发布时间:2019-03-06

本文共 2039 字,大约阅读时间需要 6 分钟。

wxWidgets中的消息映射表是GUI程序中处理用户操作的核心机制,所有操作行为均通过消息传递实现。本文将详细介绍静态和动态消息映射表的实现方式及其工作原理。

静态消息映射表

静态消息映射表通过EventTable实现事件号与处理函数的绑定。使用宏定义的方式可以方便地定义消息映射关系。以下是常用的宏定义和实现方法:

#define DECLARE_EVENT_TABLE() \  private:                   \    static const wxEventTableEntry sm_eventTableEntries[]; \  protected:                 \    static const wxEventTable sm_eventTable; \    virtual const wxEventTable* GetEventTable() const; \    static wxEventHashTable sm_eventHashTable; \    virtual wxEventHashTable& GetEventHashTable() const

消息映射关系由BEGIN_EVENT_TABLE和END_EVENT_TABLE包围,具体示例如下:

BEGIN_EVENT_TABLE(MyFrame, wxFrame)  EVT_MENU(ID_MenuUser, MyFrame::OnCheckMenu)END_EVENT_TABLE()

EVT_MENU(ID_MenuUser, MyFrame::OnCheckMenu)会展开为以下代码:

wxEventTableEntry(wx.EVT_MENU, winid, wxID_ANY, wxNewEventTableFunctor(wx.EVT_MENU, wxCommandEventHandler(MyFrame::OnCheckMenu)), NULL)

wxNewEventTableFunctor用于创建wxObjectEventFunctor对象,并通过wxCommandEventHandler将消息处理函数强制转换为wxCommandEventFunction类型。

静态消息映射表处理过程

静态消息表的处理流程如下:

  • 调用GetEventTable方法获取事件表
  • 使用HandleEvent方法处理消息
  • HandleEvent方法根据消息类型查找对应的事件表段
  • 遍历事件表段中的每个事件映射项,调用ProcessEventIfMatchesId方法进行处理
  • ProcessEventIfMatchesId方法的具体实现逻辑包括:

  • 检查消息是否匹配当前项的事件类型和ID
  • 调用用户定义的处理函数
  • 如果事件被处理,返回true,否则返回false
  • 动态消息映射表

    动态消息映射表通过wxEvtHandler类的Bind接口实现,提供三种绑定方式:

  • 绑定全局函数(推荐使用)
  • 绑定Funtor函数(不推荐使用)
  • 绑定类内部函数(推荐使用)
  • Bind接口的三种模板函数定义如下:

    template
    void Bind(const EventTag& eventType, void (*function)(EventArg&), int winid = wxID_ANY, int lastId = wxID_ANY, wxObject* userData = NULL)template
    void Bind(const EventTag& eventType, const Functor& functor, int winid = wxID_ANY, int lastId = wxID_ANY, wxObject* userData = NULL)template
    void Bind(const EventTag& eventType, void (Class::*method)(EventArg&), EventHandler* handler, int winid = wxID_ANY, int lastId = wxID_ANY, wxObject* userData = NULL)

    动态消息映射表处理过程

    动态消息表的处理流程与静态表类似:

  • 调用TryHereOnly方法处理消息
  • 首先处理动态事件表中的消息
  • 遍历动态事件表中的每个事件项,调用ProcessEventIfMatchesId方法进行处理
  • SearchDynamicEventTable方法负责遍历动态事件表的节点,查找匹配的事件项,并调用相应的处理函数。

    通过以上方法,开发者可以灵活地管理应用程序中的消息映射关系,充分发挥wxWidgets的强大功能。

    转载地址:http://soyfz.baihongyu.com/

    你可能感兴趣的文章
    python---使用celery分布式系统异步发送短信(云通讯)来验证登录
    查看>>
    python--003--百分号字符串拼接、format
    查看>>
    Python--10、线程
    查看>>
    Python--Redis实战:第四章:数据安全与性能保障:第4节:复制
    查看>>
    python--基本代码规范
    查看>>
    Python--抽象类接口类
    查看>>
    PYTHON--欧拉习题二
    查看>>
    python--高级应用总结
    查看>>
    python-520表白代码,我看谁说程序员不懂浪漫,送你几套表白代码,一步到位
    查看>>
    Python-Asyncio TypeError:无法在‘;等待‘;表达式中使用对象DICT
    查看>>
    Python-AttributeError:‘;dict&39;对象没有属性‘;序列‘;
    查看>>
    Python-ldap:是否可以在不显式写入密码的情况下进行绑定?
    查看>>
    python出现 unknown encoding: idna 的处理方法
    查看>>
    Python出现 RuntimeError: dictionary changed size during iteration 的解决方法
    查看>>
    Python-numpy(2)数组的操作
    查看>>
    Python-Numpy的tile函数用法
    查看>>
    python-open函数
    查看>>
    Python-Pandas-将特定函数应用于给定级别-多索引数据框架
    查看>>
    python-queue队列通信
    查看>>
    python-ros No module named PyKDL
    查看>>