mfc大观之五、六(消息机制和消息运行)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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大观之五、六(消息机制和消息运行)相关推荐
- mfc编程消息机制中消息汇总
做VC开发必须熟悉消息机制,笔试面试重点,自己在这方面很欠缺,搜集学习一下 WM_CREATE CreateWindow 初始化工作 GetMessage 遇到WM_QUIT,程序结束 Dispatc ...
- iOS的消息机制和消息转发
1.消息机制 RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制. 对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ).编译完成之后直接 ...
- Android 消息机制(Handler运行机制)
1 Android 消息机制 Android 的消息机制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑 2 为什么要用Handler消息 ...
- linux的消息机制,linux消息机制的过程是什么啊,请赐教
LINUX的安装过程很简单,按照它的提示进行就可以了.重点就是分区那里.通常我们使用双系统,那样我们在LINUX分区的时候不要把WIN分区跟格掉就好,然后要记得分一个SWAP分区,然后根据您的需要进行 ...
- c语言linux消息机制,linux消息机制的过程是什么啊,请赐教
LINUX的安装过程很简单,按照它的提示进行就可以了.重点就是分区那里.通常我们使用双系统,那样我们在LINUX分区的时候不要把WIN分区跟格掉就好,然后要记得分一个SWAP分区,然后根据您的需要进行 ...
- 【转】编程思想之消息机制
从一个剧情开始 路遥的<平凡的世界>因为翻拍成电视剧,又再次火起来了!我们就从这里开始吧,其小说是以这样一个场景开头的: 在一个半山腰县立高中的大院坝里,在一个校园内的南墙根下,按班级排起 ...
- Android 消息机制详解(Android P)
前言 Android 消息机制,一直都是 Android 应用框架层非常重要的一部分,想更加优雅的进行 Android 开发,我想了解消息机制是非常必要的一个过程,此前也分析过很多次 Handler ...
- Android Handler消息机制源码分析
一,前言 众多周知, Android 只允许在主线程中更新UI,因此主线程也称为UI线程(ActivityThread). 如此设计原因有二: (1) 由于UI操作的方法都不是线程安全的,如果多个线程 ...
- android消息机制—Looper
Looper在android的消息机制充当消息循环的角色,它不停的充MessageQueue中拿出消息,并将消息交给Hanlder处理,下面是他的常用方法解析. 项目源码 Looper的创建 1. a ...
最新文章
- fiddler 在火狐(firefox)下无效的问题 ——Fiddler监听Firefox、Chrome中的http请求
- 为维护视图创建事物码
- [css] 你知道CSS中的字母“C“代表什么吗?
- 配置eclipse,创建类/方法时自动生成作者、创建日期、方法功能等注释
- 【GDB调试学习笔记】Makefile多级目录生成可执行文件
- spring StopWatch用法
- 佳蓝php智能应答系统|在线客服 v1.0,佳蓝PHP智能应答系统|在线客服 v1.0
- 物联网带动传感器站上风口 华灿光电并购美新半导体
- C语言之for循环应用之断案篇----找凶手
- Windows系列操作系统注册表的组成与分析(转)
- android+桌面组件开发,android——桌面组件的开发
- 华为智能音响2代鸿蒙,99999元!华为全屋智能方案来了:鸿蒙生态是亮点
- 做独立站如何精准引流
- Java实现远程主机唤醒 (WOL)
- CoAP学习笔记——CoAP格式详解
- php 网页截图,codefromnet/PHP网页截图-网页快照实现.txt at master · yangyu0116/codefromnet · GitHub...
- 【Android -- 面试】复习指南之 Android 高级(下)
- 代码 - 多张图片合并成PDF(每页宽高即是当前页面图片的宽高)- itextpdf
- echart简单介绍
- C# ushort强制转换int会导致丢失