博客
关于我
wxWidgets源码分析(3) - 消息映射表
阅读量:459 次
发布时间: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_TABLEEND_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/

    你可能感兴趣的文章
    Objective-C实现生成正态分布数据(附完整源码)
    查看>>
    Objective-C实现电子词典(附完整源码)
    查看>>
    Objective-C实现离散傅里叶变换(附完整源码)
    查看>>
    Objective-C实现移位密码加解密(附完整源码)
    查看>>
    Objective-C实现给定一个数字数组,返回最大乘积数组中的 3 个数字算法(附完整源码)
    查看>>
    Objective-C实现维吉尼亚密码加解密算法(附完整源码)
    查看>>
    Objective-C实现维吉尼亚密码加解密算法(附完整源码)
    查看>>
    Objective-C实现缓冲区(附完整源码)
    查看>>
    Objective-C实现罗马数字转十进制算法(附完整源码)
    查看>>
    Objective-C实现翻转图像augmentation算法(附完整源码)
    查看>>
    Objective-C实现莱布尼兹级数求解π的近似值(附完整源码)
    查看>>
    Objective-C实现获取 Collatz 序列长度算法(附完整源码)
    查看>>
    Objective-C实现获取CPU温度(附完整源码)
    查看>>
    Objective-C实现获取GPU显卡信息(附完整源码)
    查看>>
    Objective-C实现获取HID设备列表 (附完整源码)
    查看>>
    Objective-C实现获取文件头的50个字符(附完整源码)
    查看>>
    Objective-C实现获取本机ip及mac地址(附完整源码)
    查看>>
    Objective-C实现获取本机系统版本(附完整源码)
    查看>>
    Objective-C实现解密藏头诗(附完整源码)
    查看>>
    Objective-C实现醉汉随机行走问题(附完整源码)
    查看>>