【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

写过windows程序的朋友都知道,win32主要是利用消息进行界面的编写的。那么在mfc中,系统是如何处理消息的。换句话说,mfc是如何利用类的特性进行消息的传递的。说到这,当让离不开之前说道的静态变量机制。事实上,mfc中所有的消息都是保存在静态全局变量中的。下面是一段示例代码,大家可以体会一下。

#include <iostream>
using namespace std;class cobject;
struct runclass;#define get_class(basic) \basic::get_run_class()#define CREATE_MESSAGE(basic) \static runclass run_##basic; \static runclass* get_run_class() {return &run_##basic;} class cobject{public:CREATE_MESSAGE(cobject)public:cobject() {cout << "cobject::cobject()" << endl; }virtual ~cobject() {cout << "cobject::~cobject()" << endl;}virtual void process() {cout << "cobject::process()" << endl;}};typedef void (cobject::*func)();struct message {int id;func f;
};struct runclass {char name[64];struct runclass* next;struct message msg;};runclass cobject::run_cobject = {"cobject", NULL, {0, &cobject::process}};#define IMPLEMENT_MESSAGE(basic, origin) \runclass basic::run_##basic = {#basic, &origin::run_##origin, {0, static_cast<func>(&ctemplate::process)}}class ctemplate : public cobject {public:ctemplate() {cout << "ctemplate::ctemplate()" << endl;}~ctemplate() {cout << "ctemplate::~ctemplate()" << endl;}void process() {cout << "ctemplate::process()" << endl;}CREATE_MESSAGE(ctemplate)
};IMPLEMENT_MESSAGE(ctemplate, cobject);bool
isKindOf(runclass* basic, runclass* origin){if(NULL == basic || NULL == origin)return false;while(basic->next)basic = basic->next;return 0 == strcmp(basic->name, origin->name) ? true :false;
}int
main(int argc, char* argv[]){return 0;
}

有了消息之后,如果真的接收到了系统的消息,那么又改如何处理呢?之前我们编写mfc的代码,不知道大家有没有注意,同样一段代码,放在view里面可以,放在doc也可以,放在frame好像也没问题,这是为什么?其实不复杂,主要是mfc框架在处理消息的时候,会把frame、doc、view都遍历一遍,等到真的没有对应处理函数的时候才会返回上去,说到这里,大家应该有一些明白了。

#include <iostream>
using namespace std;class cobject;
struct runclass;#define get_class(basic) \basic::get_run_class()#define CREATE_MESSAGE(basic) \static runclass run_##basic; \static runclass* get_run_class() {return &run_##basic;} class cobject{public:CREATE_MESSAGE(cobject)public:cobject() {cout << "cobject::cobject()" << endl; }virtual ~cobject() {cout << "cobject::~cobject()" << endl;}virtual void process() {cout << "cobject::process()" << endl;}};typedef void (cobject::*func)();struct message {int id;func f;
};struct runclass {char name[64];struct runclass* next;struct message msg;};runclass cobject::run_cobject = {"cobject", NULL, {0, &cobject::process}};#define IMPLEMENT_MESSAGE(basic, origin) \runclass basic::run_##basic = {#basic, &origin::run_##origin, {100, static_cast<func>(&ctemplate::process)}}class ctemplate : public cobject {public:ctemplate() {cout << "ctemplate::ctemplate()" << endl;}~ctemplate() {cout << "ctemplate::~ctemplate()" << endl;}void process() {cout << "ctemplate::process()" << endl;}CREATE_MESSAGE(ctemplate)
};IMPLEMENT_MESSAGE(ctemplate, cobject);bool
isKindOf(runclass* basic, runclass* origin){if(NULL == basic || NULL == origin)return false;while(basic->next)basic = basic->next;return 0 == strcmp(basic->name, origin->name) ? true :false;
}bool
process_msg(cobject* c, int value){struct runclass* p;// process message, see if cobject can process itp = get_class(cobject);if(value == p->msg.id){(c->*(p->msg.f))();return true;}// process message, see if ctemplate can process itp = get_class(ctemplate);if(value == p->msg.id){(c->*(p->msg.f))();return true;}return false;
}int
main(int argc, char* argv[]){return 0;
}

mfc大观之五、六(消息机制和消息运行)相关推荐

  1. mfc编程消息机制中消息汇总

    做VC开发必须熟悉消息机制,笔试面试重点,自己在这方面很欠缺,搜集学习一下 WM_CREATE CreateWindow 初始化工作 GetMessage 遇到WM_QUIT,程序结束 Dispatc ...

  2. iOS的消息机制和消息转发

    1.消息机制 RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制. 对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ).编译完成之后直接 ...

  3. Android 消息机制(Handler运行机制)

     1 Android 消息机制 Android 的消息机制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑 2 为什么要用Handler消息 ...

  4. linux的消息机制,linux消息机制的过程是什么啊,请赐教

    LINUX的安装过程很简单,按照它的提示进行就可以了.重点就是分区那里.通常我们使用双系统,那样我们在LINUX分区的时候不要把WIN分区跟格掉就好,然后要记得分一个SWAP分区,然后根据您的需要进行 ...

  5. c语言linux消息机制,linux消息机制的过程是什么啊,请赐教

    LINUX的安装过程很简单,按照它的提示进行就可以了.重点就是分区那里.通常我们使用双系统,那样我们在LINUX分区的时候不要把WIN分区跟格掉就好,然后要记得分一个SWAP分区,然后根据您的需要进行 ...

  6. 【转】编程思想之消息机制

    从一个剧情开始 路遥的<平凡的世界>因为翻拍成电视剧,又再次火起来了!我们就从这里开始吧,其小说是以这样一个场景开头的: 在一个半山腰县立高中的大院坝里,在一个校园内的南墙根下,按班级排起 ...

  7. Android 消息机制详解(Android P)

    前言 Android 消息机制,一直都是 Android 应用框架层非常重要的一部分,想更加优雅的进行 Android 开发,我想了解消息机制是非常必要的一个过程,此前也分析过很多次 Handler ...

  8. Android Handler消息机制源码分析

    一,前言 众多周知, Android 只允许在主线程中更新UI,因此主线程也称为UI线程(ActivityThread). 如此设计原因有二: (1) 由于UI操作的方法都不是线程安全的,如果多个线程 ...

  9. android消息机制—Looper

    Looper在android的消息机制充当消息循环的角色,它不停的充MessageQueue中拿出消息,并将消息交给Hanlder处理,下面是他的常用方法解析. 项目源码 Looper的创建 1. a ...

最新文章

  1. fiddler 在火狐(firefox)下无效的问题 ——Fiddler监听Firefox、Chrome中的http请求
  2. 为维护视图创建事物码
  3. [css] 你知道CSS中的字母“C“代表什么吗?
  4. 配置eclipse,创建类/方法时自动生成作者、创建日期、方法功能等注释
  5. 【GDB调试学习笔记】Makefile多级目录生成可执行文件
  6. spring StopWatch用法
  7. 佳蓝php智能应答系统|在线客服 v1.0,佳蓝PHP智能应答系统|在线客服 v1.0
  8. 物联网带动传感器站上风口 华灿光电并购美新半导体
  9. C语言之for循环应用之断案篇----找凶手
  10. Windows系列操作系统注册表的组成与分析(转)
  11. android+桌面组件开发,android——桌面组件的开发
  12. 华为智能音响2代鸿蒙,99999元!华为全屋智能方案来了:鸿蒙生态是亮点
  13. 做独立站如何精准引流
  14. Java实现远程主机唤醒 (WOL)
  15. CoAP学习笔记——CoAP格式详解
  16. php 网页截图,codefromnet/PHP网页截图-网页快照实现.txt at master · yangyu0116/codefromnet · GitHub...
  17. 【Android -- 面试】复习指南之 Android 高级(下)
  18. 代码 - 多张图片合并成PDF(每页宽高即是当前页面图片的宽高)- itextpdf
  19. echart简单介绍
  20. C# ushort强制转换int会导致丢失

热门文章

  1. 慕课网上的星级评分--学习视频后模仿实现
  2. denyhosts、中文文档乱码、端口占用查询
  3. 使用Weka进行数据挖掘
  4. Arduino+Avr libc制作Badusb原理及示例讲解
  5. 关于ecplise中一些很实用的技巧
  6. mysql 协议的processInfo命令包及解析
  7. UVA 12898 - And Or 与和或 (思路题)
  8. CentOS 编译 Nginx 服务
  9. bzoj 4624 农场种植 fft
  10. CentOS+Subversion