MSDN里面有一些专题值得读一下,至少知道MFC的目的和一些方法或者手段。随便乱写一些,如果以后发现还有价值的话就整理。
1)MFC是对平台SDK的一个大封装。
学了C++,还不知道C++能干嘛,不知道就算能干这些,又有什么用,甚至不知道为什么要设计类,为什么要封装。
WINDOWS里的资源是用句柄表示的,句柄这个词不知道是哪个中国IT菜手翻译的,handle干嘛要这么翻译?它的意义很明显嘛,处理,为什么要处理?有人说,它是微软要隐含内部实现,因为它是商业软件嘛,我觉得不是,这不是根本原因,它原本的目的还是为了代码的向后兼容和可复用性。比如最重要一种资源,文件,它是和具体设备相关的,但文件操作只对一个文件的HANDLE进行处理,就是把它的定义和处理分开,C语言里的FILE也是一样的道理。各种各样的资源统一处理,在系统里统一表示,这样系统就会有条不紊地工作。也算是一个小的封装吧,具体实现和外部代码的分开,封装。于是有了SDK编程。
MFC封装在外面,更大的封装,它是为了让程序员把搭建一个复杂的WIN32程序,从设计那些复杂的实现中解放出来,把开发重点放在软件的数据结构和算法上。由于SDK封装得低,所以可以认为那些handle本身就是资源本身,可以这样认为。再在这之上进行面向类的封装,就是MFC。
有人说懂得了继承,才真正懂得了面向对象,或者C++。C++的目标或许也是这样吧,虽然语言本身没告诉我们它的目的是什么,做为了个成熟的类库,比如MFC,我们不仅仅是简单的利用它的一些功能调用,比如用CCommonDialog,而关键是选择合适的类继承下来,设计自己的子类,来实现整个软件的功能。
在面对各种各样的MFC中的类,要记住一点,类生成的对象,本身并不代表资源本身,比如CEdit并不是EditBox,它们之间可以有联系,但这个联系可以人为的剪断,对象只是一个从操作到资源的一个纽带。这也是为什么它有构造函数,却要用::Create()创建的原因。
2)弄清消息分发的过程。
消息的机制是为了让WINDOWS变迟顿,让它‘慢’下来,只有你‘叫’它做事它才做,由主动工作变为被动工作。有时候发送消息本身也可以看成消息处理本身。MFC对消息的处理封装得可就复杂了,不是非要弄得非常清楚才行,要知道消息被MFC丢来丢去的先后顺序,比如一个按钮的COMMAND响应可以给CWinAPP也可以给框架,也可以给文档,也可以给视类,都可以处理,那消息是怎么‘流’的呢?这个先后过程比较重要。比如窗口创建的时候,有OnCreate,PreCreateWindow等,那创建的时候是什么个过程,有些处理过程因为会被消息处理调用,调用的过程也可以认为是消息‘流’向。
3)框架类/文档类/视类三位一体,共同完成一件任务。
文档类和视类的分开是很有道理的,文档负责数据的存储和转储,视类负责数据的显示。一个文档可以有多个视类对象,但一个视类对象只有一个文档,多个文档被文档管理器管理。好像一个软件,最最小的软件,也是要和某个文档相关的,面向文档,也是个软件的思想。
4)对话框类用于数据的表示或修改。
对话框是真正可视的,在上面拖控件,让控件关联变量,非常好用的是DDX/DDV,非常人性化,数据类型的转换和数据的完整性都帮你解决了。非常好用。
5)源文件,CMetaFileDC,一种只保存了操作本身,而没保存DC上的结果,相当于失量图。
6)对象的可串行化。
为什么要可串行化?为什么不直接用输入输出流?用CFile和CArchive一起实现。其实这种思想我之前想到过,就是一个类对象的生命期可以在硬盘上延长,比如构造的时候从文件构造,析构的时候转储到硬盘。
评论