首先声明我是来砸场子的,呵呵好久好久没玩VC++了,一直对MFC没有深入了解耿耿于怀,这些天抽空重新捡起来研究了一下
为了避免使用虚函数带来大的开销,消息处理是使用宏来进行消息映射处理
每增加一个(消息宏 + 消息处理函数)完成一个消息处理,当然消息宏不是随便加的,因为有可能控件根本与某些消息无关。Delphi-VCL 是这样做的,在管理器里每个控件都有一个消息处理列表,在对应的消息处填上你的消息处理函数即可
实际过程是delphi有一个类似virtual的dynamic形式的方法的处理,将函数都编号(消息编号)放在父类的DMT表里,具体过程还不是特别的清楚
在TWinControl这个类里可以看到所有消息处理函数声明,消息路由和MFC的貌似也差不多。所以在delphi里你是看不到消息宏声明的,只有消息处理函数,在管理器里可以查询其对应关系。结论:
MFC消息处理大量使用宏这个东西,我觉得好原始,不好管理,不易调试,学习起来也增加了难度。你们觉得宏这个东西是好东西吗?是C++语言的局限性还是一些人装比故弄玄虚呢。欢迎拍砖(说不定还有我的同学在内),手下留情,嘿嘿PS:仅限于VC++6
为了避免使用虚函数带来大的开销,消息处理是使用宏来进行消息映射处理
每增加一个(消息宏 + 消息处理函数)完成一个消息处理,当然消息宏不是随便加的,因为有可能控件根本与某些消息无关。Delphi-VCL 是这样做的,在管理器里每个控件都有一个消息处理列表,在对应的消息处填上你的消息处理函数即可
实际过程是delphi有一个类似virtual的dynamic形式的方法的处理,将函数都编号(消息编号)放在父类的DMT表里,具体过程还不是特别的清楚
在TWinControl这个类里可以看到所有消息处理函数声明,消息路由和MFC的貌似也差不多。所以在delphi里你是看不到消息宏声明的,只有消息处理函数,在管理器里可以查询其对应关系。结论:
MFC消息处理大量使用宏这个东西,我觉得好原始,不好管理,不易调试,学习起来也增加了难度。你们觉得宏这个东西是好东西吗?是C++语言的局限性还是一些人装比故弄玄虚呢。欢迎拍砖(说不定还有我的同学在内),手下留情,嘿嘿PS:仅限于VC++6
解决方案 »
- 实习的苦恼
- 求大侠指导 为什么总登录失败
- DLL导出类和资源加载到一个exe程序中。在VS2005里的Debug和Release都可以正常运行,但点击编译出的exe程序,却说缺少MFC80D.DLL
- 在对话框中添加进度条控件(设置为Disble),怎么在代码中修改它的可视属性?
- 体检结果出来了,放分祝贺一下~
- CImageList 在ClistCtrl下显示如何给Image构造一个边框。
- 急!请大家说说,做中间件有前途吗,这个项目好吗?
- 怎样得到当前所有已经打开的所有View,并且自动Active其中某一个?
- 鼠标连续画线时怎么保留前面的线?
- 请问:为什么我编译的EXE总有啊?
- WIN32里如何使用spin control控件?上下颠倒咋回事?
- 关于完成端口的lpOverlapped
Delphi诞生的时候已经有很成熟的榜样了,比如微软的VB等等,也能避免很多前人走过的弯路,比如MFC;所以如果因此来下结论说MFC多原始Delphi多先进的,就有些忘本了。而MFC这方面,似乎也没有什么有名望的人物出来称颂它多么多么的优美多么多么的先进,所以不知道楼主为何会突然生出这么多胜负优劣之心的。
VC也类似, 框架相对比较简单, 所以方便性不太好"MFC消息处理大量使用宏这个东西,我觉得好原始,不好管理,不易调试,学习起来也增加了难度。"
相对初学来说可能是这样子, 但是如果自己看懂框架更助于熟悉消息机制
像Delphi 之类的经常遇到奇怪的问题, 怎么都找不到原因, 框架太大会有这个问题
一个东西的存在总有他的理由, 仁者见仁,智者见智
与Delphi比较无非是有个参照物,发表一下个人的观点而已,讨论孰优孰劣其实意义不大,这主要看应用的场合。我的意思是: 遇上这种类似窗口-消息处理的情况我们还会这么做吗,应该如何重新设计呢?
Delphi在消息处理没有使用virtual 其实和MFC相比在思想上有相似之处的
因为历史原因,肯定是不完美的.这也是qt独创了信号--槽机制的原因
MFC中的消息机制没有采用C++中的虚函数机制,原因是消息太多,虚函数开销太大.在Qt中也没有采用C++中的虚函数机制,原因与此相同.其实这里还有更深层次上的原因,大体说来,
多态的底层实现机制只有两种,一种是按照名称查表,一种是按照位置查表,两种方式各有利弊,而C++的虚函数机制无条件的采用了后者,导致的问题就是在子类很少重载基类实现
的时候开销太大,再加上象界面编程这样子类众多的情况,基本上C++的虚函数机制就废掉了,于是各家库的编写者就只好自谋生路了,说到底,这确实是C++语言本身的缺陷