博客
关于我
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中一个图形中的多个绘图
    查看>>
    python中一个好的持久同步队列
    查看>>
    Python中不准确的对数
    查看>>
    python中什么是实例方法_在Python中创建实例方法对象的不同方法
    查看>>
    Python中使用cutecharts实现简单的手绘风格的图表
    查看>>
    python中使用dxfgrabber,解析dxf文件信息生成obj文件
    查看>>
    Python中使用ncmbot玩转网易云音乐
    查看>>
    Python中使用PIL快速实现二值图
    查看>>
    Python中使用PIL快速实现灰度图
    查看>>
    Python中使用pip install ncmbot时各种错误解决办法
    查看>>
    Python中使用requests和parsel爬取喜马拉雅电台音频
    查看>>
    Python中使用turtle绘制多个同心圆
    查看>>
    Python中使用turtle绘制棋盘详解
    查看>>
    Python中使用wordcloud生成漂亮的中文词云
    查看>>
    Python中使用wxpy定时机器人给微信好友发送每日一文
    查看>>
    Python中使用zip()并行迭代
    查看>>
    Python中使用推导式创建序列
    查看>>
    Python中信号处理程序和atexit处理程序的调用
    查看>>
    Python中关于txt的简单读写模式与操作
    查看>>
    Python中关于类和函数的初体验之"__init__"和"__str__"不是"_init_"和"_str_"
    查看>>