现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

框架的学习(二):MFC初步

2012-08-27 23:42 工业·编程 ⁄ 共 1746字 ⁄ 字号 暂无评论

    现在来学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 类

image

    到这差不多的过程就完成了。上面是从过程思想来分析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类基本的东西学习了

给我留言

留言无头像?