博客
关于我
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 如何在 Web 环境中使用 Matplotlib 进行数据可视化
    查看>>
    python 如何把字符串转换成浮点数
    查看>>
    python 如果文件夹不存在就创建文件夹
    查看>>
    Python 如果有很多或以收缩形式
    查看>>
    Python 子进程 Popen 与 Pyinstaller
    查看>>
    Python 子进程 Popen.communicate() 等价于 Popen.stdout.read()?
    查看>>
    Python 子进程参数
    查看>>
    python 字典 key 和value 互换
    查看>>
    python 字典sorted自定义排序,按照key or value排序
    查看>>
    python 字典和列表区别_元组列表和字典的主要区别是什么?
    查看>>
    python 字符串中特定字符替换,截取
    查看>>
    Python 字符串总结
    查看>>
    python 字符串显示中文_Python字符串开头的b"、u"、r"与中文乱码
    查看>>
    Python 字符串的几种拼装方式
    查看>>
    python 存入数据库bigint_python基础_MySQL的bigint类型
    查看>>
    python 学习 面向对象编程
    查看>>
    Python 学习小结
    查看>>
    Python 学习日记第三篇 -- 字典
    查看>>
    Python 学习笔记(一)Data type
    查看>>
    python 安装 easy_install 和 pip 流程
    查看>>