• 消息路由 以及 消息映射与虚函数实现的分析


    win32 实现一个应用程序:

    设计  注册  创建 显示 更新  消息循环

    消息: 操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序。

    MFC 类库把功能封装成类,然后把许多全局函数制作成文件在链接过程中链接到程序中,完成整个程序的链接...

    所以,MFC程序的入口函数是WinMain函数。

    CWinApp  theApp;//代表应用程序本身... 全程序有且只有一个theApp对象.

    ________________________________________________

    消息处理及路由分析

    程序在后台维护着一个c++资源的句柄和类对象的映射表。。

    当有消息到来时,编译器会通过映射表把消息和相应的类关联,通过消息循环最终调用WindowProc函数,对消息处理。。。实现OnCmdMsg实现消息处理

    每个类都会有一个如下的消息关联表(消息与处理函数的关联表) 。于是,就遍历其关联表找到处理函数执行。如果没有找到,那么就牵涉到消息路由的问题。

    消息处理:

    BEGIN_MESSAGE_MAP

    END_MESSAGE_MAP

    消息路由:

    OnCmdMsg的处理过程分析:

    系统把消息分为三类:1、标准消息(WM_CREATE、WM_DRAW等等);2、命令消息(也就是菜单消息);3、通告消息(WM_Notify);

    a、处理标准消息时,如果不能在关联类中找到处理函数,那么只会在其基类中去路由。路由顺序:CView-->CFrameWnd-->CCmdTarget

    b、处理命令消息时,路由顺序:CView -->CDocument-->CFrameWnd-->CWinApp-->CCmdTarget

    __________________________________________________

    消息映射与虚函数实现的分析

    为什么没有用虚函数实现消息映射,而用消息宏实现消息映射?

    1、侯捷所言:内存的消耗考虑;

    2、可扩展性的考虑,因为以后如果有新的消息加入,那么需要修改类库源码,而这个宏机制实现就不存在这个问题;

    3、管理的考虑。如果用虚函数实现,那么需要为每个类添加其所有的消息响应函数,但是实际上程序中每次只需要用到许多消息中的少几种消息即可,这样虚函数实现会存在大量的浪费问题,而宏机制实现就不在这个问题。

    参考链接:http://blog.csdn.net/zdl1016/article/details/4813193

  • 相关阅读:
    IntelliJ IDEA基本设置
    git安装
    Git的作用与安装
    git是什么
    SpringMVC控制器类方法的返回值
    SpringMVC中Model机制
    什么是Nosql
    如何使用Jedis操作redis
    redis中数据类型操作命令
    redis的全局命令
  • 原文地址:https://www.cnblogs.com/xuxu8511/p/2454067.html
Copyright © 2020-2023  润新知