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

    你可能感兴趣的文章
    Nginx的使用总结(一)
    查看>>
    Nginx的是什么?干什么用的?
    查看>>
    Nginx访问控制_登陆权限的控制(http_auth_basic_module)
    查看>>
    nginx负载均衡的五种算法
    查看>>
    Nginx配置ssl实现https
    查看>>
    Nginx配置TCP代理指南
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    Nginx配置参数中文说明
    查看>>
    Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
    查看>>
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>
    NIO Selector实现原理
    查看>>
    NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
    查看>>
    NI笔试——大数加法
    查看>>
    NLP 基于kashgari和BERT实现中文命名实体识别(NER)
    查看>>
    NMAP网络扫描工具的安装与使用
    查看>>
    NN&DL4.3 Getting your matrix dimensions right
    查看>>
    NN&DL4.8 What does this have to do with the brain?
    查看>>
    No 'Access-Control-Allow-Origin' header is present on the requested resource.
    查看>>
    No fallbackFactory instance of type class com.ruoyi---SpringCloud Alibaba_若依微服务框架改造---工作笔记005
    查看>>