现在来学MFC,嘿嘿!有些落伍了!不过我也有我的原因。第一 要完成的毕业程序跟网络基本上没什么关系。在独立PC上做windows 程序,一般而言MFC一般是不二选择。 其次现在.net,j2ee什么的框架虽然先进些,但是手头上却没有他们实现的源代码。net自不必说,java那套的东西找起来又麻烦。而MFC源代码在VC上自带着对于学习者而言这是莫大的福音。其三 但就我理解框架而言MFC已经包括框架的基本要求功能延伸和设计模式指导。所以学习MFC对于学习.net 等框架在宏观上还是有帮助的。所以先学习着MFC 再说。呵呵!
我学习MFC的目标一个就是学习如何使用MFC为下一步的工作做准备。其次就是学习其设计类方法 再次就是其C++语言的应用技巧。废话不说现在正式开学。
MFC说简单点就是一堆类一些Afx开头的全局函数,学习MFC就是学习这些类和全局函数。每个类都记住老实说记不住。所以我从MFC的目的入手分析MFC设计思路。
MFC的目的
其一 帮助windows程序员使用OO实现编写程序,所以其需要对windows 的API进行类包装。于是这就产生了一堆类。(当然这种包装是从数据抽象的思想上来包装的)
其二 帮助程序员快速设计出windows界面 于是就诞生了一些UI 类
其三 对于程序员设计程序给出指导于是就产生了关于Document/view的一系列类(这些东西在SmallTalk中应该就诞生了MFC 直接拿过来用了,当然后来structs技术也吸收了这个设计模式)
其四 对于C++语言进行必要的扩展,如容器类CARRAY等。
MFC 的成本
MFC 要实现上面的目标的成本主要是C++ 语言的实现成本,不过有几个额外的成本:
首先是MFC为了实现类的动态创建,序列化,以及消息传递等定义了一系列的宏虽然降低了MFC 的实现成本但提高了学习成本。
其次MFC使用了大量的win32自定义的数据类型,这个降低了使用MFC 程序的可移植性。
以上基本上是MFC框架的大概的分类;不过我先学第一个MFC对于Windows API 的包装。
在很多书里甚至包括著名深入浅出MFC,在讨论API相关类的时候都是各处一个hello程序,然后开始分析那个类将那个部分给包装起来。那个类的流程是怎么样的。当然在当时这是非常良好的,因为当时人们对于OO 思想还不是很了解所以这样的思路有助于人们学习MFC的框架。但是从OO的角度来说这样这样分析一个类库还是新瓶装旧酒,程序是对象化了但思想还是过程的。个人认为OO精髓之一在于从过程抽象走向了数据抽象。不过在这里为了能让自己好好复习一下学习东西。所以打算分成两个部分,一个按书上说的方式分析API 类,一个是按我觉得的想法分析API类。
过程化分析API 类
到这差不多的过程就完成了。上面是从过程思想来分析MFC,下面从OO思想来分析MFC.
首先分析找出类。
第一反应就窗体,于是第一个类诞生
其次分析创建窗体需要的而外数据 这些就包括了main函数参数。这些东西是这个应用程序的全国有关的所以将其封装成一个类及CWInApp类
再次window程序是多任务程序所以存在线程的概念所以再得一类现成类
其次分析类关系
这包括两个部分一个抽象类一个是类关系先做类抽象
类抽象
1 于MFC所有的类都要实现动态创建,错误诊断等功能所以将这些方法全都封装在一个类CObject中其他类都派生于它。
2 由于除去扩展C++ ,异常处理以及GDI等类都要进行消息传递等工作所以将消息传递封装在一个类CCmdTarget中。基本所有的UI类都派生于这个类
3 其次这个windows的线程感念与app可以认为是继承关系所以theApp继承CWinThread
分配类的职责
CWinApp类 其掌握的数据主要是程序实例句柄所以主要的作用是初始化程序
CWnd类 数据主要是窗体句柄根据内容相关性原则将创建窗体的任务交给他
CWinThread类 在早期版本的MFC中(如在深入浅出MFC中)将消息循环的任务分配给了CWinApp但是由于多线程的关系所以将消息循环给了CWinThread。
CObject类 主要所动态创建等
CCmdTarget类 主要是消息传递
到此差不多MFC的API类基本的东西学习了