分类:
2006-05-31 20:18:37
1 MFC概述
顾名思意,MFC应用程序框架是以MFC作为框架基础的,以此程序框架模式搭建起来的应用程序在程序结构组织上是完全不同于以前的Win32 SDK编程方式的。自20世纪90年代初问世以来,MFC一直试图把Windows API函数封装到类库中个各个逻辑类中。MFC的这种封装并非简单地对API函数进行分组与打包,而是更多地通过类来试图实现全部的系统策略。随着越来越多系统功能的加入,MFC的规模也在不断拓展,目前已包括有200多个类,涵盖了通用Windows 类、文档/视框架、OLE、数据库、Internet以及分布式功能等多方面的基本内容。这样一个坚实的程序开发基础无疑从很大程度上方便了程序设计人员对Windows 程序的开发。
MFC提供了相当多不同功能的类以适合尽可能广泛的需求。这里绝大多数的MFC类都是直接或间接从CObject类派生出来的,CObject类为其派生类提供了三个重要的特性支持:持久性(Serialization)支持、运行时(Run-time)类信息支持和诊断(Diagnostic)调试支持等。其中持久性是以流的方式将某个类对象中的持久性数据输出或输入到外部存储介质如磁盘文件等的过程;运行时类信息(Run-time Class Information,RTCI)则可以重新获取一个对象的类名及其他一些有关对象在运行时的信息。RTCI也是C++中除运行时类型信息(Run-time Type Information,RTTI)机制外的另一个重要工具;诊断和调试支持作为CObject类的一个组成部分,可以在实现CObject派生类时执行有效性检查并可向调试窗口输出状态信息。
并非MFC提供的所有函数都是类成员函数,MFC也提供了一系列以Afx为前缀的全局函数。类成员函数只能在其所属类对象所在的上下文中使用,但是这些AFX函数却可以在任何时候的任何地方直接使用。下表列出的是几个比较重要AFX函数:
函数名 | 函数说明 |
AfxAbout | 无条件终止一个应用程序;通常在发生无法回复的错误时使用 |
AfxBeginThread | 创建一个新的线程并开始执行 |
AfxEndThread | 终止当前正在执行的线程 |
AfxMessageBox | 显示一个Windows 消息窗口 |
AfxGetApp | 返回一个指向应用程序对象的指针 |
AfxGetAppName | 返回应用程序名 |
AfxGetMainWnd | 返回一个指向应用程序主窗口的指针 |
AfxGetInstanceHandle | 返回一个标识当前应用程序实例的句柄 |
AfxRegisterWndClass | 为一个MFC应用程序注册一个用户自定义的窗口类 |
2 MFC对API函数的封装
如果读者曾经有过SDK的开发经历,一定会对其烦琐的编程方式和大量的Win32 API函数调用深有感触。所有不同功能的API函数均是以全局函数的形式放在一起的,由于API函数数目比较庞大,因此无论是学习还是使用都是有一定难度的。相比而言,建立在API函数基础之上的MFC类库则通过把相关API函数的分类封装而可以大大简化编程的难度,用MFC类编写的Windows 应用程序完成相同的任务只需要进行少量的工作。
众多的API函数根据功能的不同而被MFC封装到200多个类中,这些类基本涵盖了进行Windows 编程大部分可能用到的功能。由于封装后的MFC类太多,这里不能一一介绍,下面就以其中比较重要的CObject类和CWnd类为例对API函数的封装情况做%D