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

来源:互联网 发布:淘宝店美橙文具可信吗 编辑:程序博客网 时间:2024/05/17 00:18

   现在来学MFC,嘿嘿!有些落伍了!不过我也有我的原因第一 要完成的毕业程序跟网络基本上没什么关系在独立PC上做windows 程序一般而言MFC一般是不二选择。 其次现在.netj2ee什么的框架虽然先进些但是手头上却没有他们实现的源代码.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

             Win32                          MFC

  Main函数 1 WinMain()   ————————   1  声明CMYWinApp对象 theApp

2 _tWinMain()   ---- 一个宏为了能国际化

AfxWinMain()  ----  隐含在MFC

3         AfxWinInit 初始化全局应用程序对象theApp以及线程对象

4         调用theApp->InitApplication 主要是为D/V结构做准备

注册类 2 RegisterClass()———————    5   调用 theThread->InitInstance 这里在theThread指向的对象是theApp CWinAppCWinThread的派生类所以theThread->InitInstance调用的是theAppInitInstance函数。

5         InitInstance new 一个窗体对象

6         窗体对象的构造函数调用成员函数Create()

7         Create 函数又调用CreateEx()

8         CreateEx 先调用PreCreateWindow()

9         PreCreateWindo又调用PreCreateWindow 然后解析成AfxEndDeferRegisterClass函数完成注册类

创建类 3 CreateWindow() —————      10  CreateEx函数在调用了PreCreateWindow

                                                                                之后再调用API函数CreateWindowEx

显示类 4 ShowWindow()——————    11  调用窗体对象的showWindow函数这是

                                                                                  直接调用API函数

更新窗体5 UpdateWindow  ——————    12  调用窗体对象的UpdateWindow函数是

                                                                               直接调用API函数

消息循环 6 while(){}     ———————    13  封装在CWinThreadRun 函数中

 

窗口函数 winPro       _————————   MFC 有个默认的winPro DefWinPro

 

到这差不多的过程就完成了。

 

上面是从过程思想来分析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 主要是消息传递

 

到此差不多MFCAPI类基本的东西学习了