总观 Application Framework
MFC 在1.0 版时期的诉求是「一组将SDK API 包装得更好用的类别库」,从2.0 版开始更进一步诉求是一个「Application Framework」,拥有重要的Document-View 架构;
随后又在更新版本上增加了OLE 架构、DAO 架构... 。
1.MFC 类别主要可分为:
■ General Purpose classes -适用于Windows,也适用于DOS。
CObject:Dynamic Creation、RTTI(CRuntimeClass)、Persistence(CArchive)、Diagnostic(CDumpContext)。
杂项类别:CRect CSize CPoint CTime(绝对时间) CTimeSpan(以秒数表现相对时间) CString
数据处理类别(collection classes ):Array 或List 或Map 等等,都内含「加入」或「删除」或「巡访」等成员函数。支持Serialization ,可以单一一进程序代码就写到文件中(或从文件读出)。
异常处理类别(exception handling classes):发生在程序执行时期的不正常情况
■ Windows API classes -这些类别的成员函数所对应的各个Windows API 函数。
CWinThread -程序中的一个执行线程。SDK 程序中标准的消息循环已经被封装在此类中
CWinApp -代表应用程序。衍生自CWinThread;任何32 位Windows 程序至少由一个执行线程构成。
CWnd -所有窗口,衍生自CCmdTarget;主框窗口、子框窗口、对话框、控制组件、view 视窗对应的C++类别。凡衍生自CWnd之类别才能收到WM_ 窗口消息(WM_COMMAND 除外)。
「窗口handle」和「C++对象」结盟:CWnd对象的成员变数m _hWnd,就放着对应的窗口handle。
CCmdTarget -衍生自它的类别才能够处理命令消息WM_COMMAND。
GDI 类别、DC 类别、Menu 类别。
■ Application framework classes -组成应用程序骨干者
Document/View的观念是希望把资料的本体,和资料的显像分开处理。由于文件产生之际,必须动态生成Document/View/Frame 三种对象,Document Template扮演黏胶的角色,把其胶黏在一块儿。
CSingleDocTemplate一次只支持一种文件类型,CMultiDocTemplate 可同时支持多种文件类型。注意,这和MDI程序或SDI程序无关
CDocument-当你为自己的程序由CDocument 衍生出一个子类别后,应该在其中加上成员变量,以容纳文件资料;并加上成员函数,负责修改文件内容以及读写档。读写文件由虚拟函数Serialize 负责。
CView-此类别负责将文件内容呈现到显示装置上:也许是屏幕,也许是打印机。文件内容的呈现由虚拟函数OnDraw负责。由于这个类别实际上就是你在屏幕上所看到的窗口(外再罩一个外框窗口),所以它也负责使用者输入的第一线服务。
■ high level abstractions -视觉性UI 对象属于此类
包括工具栏CToolBar、状态列CStatusBar、对话框列CDialogBar等等。
加强型的View 也属此类,如可卷动的ScrollView、以对话框为基础的CFormView 、小型文字编辑器CEditView、树状结构的CTreeView,支持RTF 文件格式的CRichEditView 等等。
■ operation system extensions -包括OLE 、ODBC 、DAO、MAPI 、WinSock、ISAPI等等。
2.Afx全域函数
C++ 并不是纯种的对象导向语言,MFC之中存在有不属于任何类别的全域函数,它在函数名称Afx前缀。
AfxWinInit AfxBeginThread AfxEndThread AfxFormatString1 AfxFormatString2 AfxMessageBox
AfxOutputDebugString AfxGetApp AfxGetMainWnd AfxGetInstance AfxRegisterClass
3.MFC宏(macros):
CObject 和CRuntimeClass 之中封装了数个所谓的object services,包括「取得执行时期的类别信息」(RTTI)、Serialization (文件读写)、动态产生对象等等。所有衍生自CObject 的类别,都继承这些机能。
DECLARE_和IMPLEMENT_的一对宏的前缀:DYNAMIC执行时期类别信息 DYNCREATE动态生成SERIAL对象内容的文件读写OLECREATE动态生成OLE对象的
MFC 的消息映射(Message Mapping)与命令绕行(CommandRouting)两个特性:
声明/开始/结束消息映射表数据结构
DECLARE_MESSAGE_MAP BEGIN_MESSAGE_MAP END_MESSAGE_MAP
增加消息映射表中的项目
ON_COMMAND ON_CONTROL ON_MESSAGE ON_OLECMD ON_UPDATE_COMMAND_UI
ON_REGISTERED_MESSAGE ON_REGISTERED_THREAD_MESSAGE ON_THREAD_MESSAGE
4.MFC 数据类型(data types):与C++ 语言数据类型之间的对应,定义于WINDEF.H中
BOOL | Boolean 值(布尔值) | LPSTR | 指向一个字符串 |
BYTE | 8-bit 整数,未带正负号 | LPCSTR | 指向一个常数字符串 |
WORD | 16-bit 整数,未带正负号 | LPTSTR | 指向一个字符串可移植到双字节字集 |
DWORD | 32-bit 整数,未带正负号 | LPCTSTR | 指向一个常数字符串可移植到双字节字集 |
LONG | 32-bit 整数,带正负号 | LPVOID | 指向一个未指定类型的资料 |
COLORREF | 32-bit 数值,代表一个颜色值 | LPRESULT | 做为窗口函数或callback 函数的回返值 |
UINT | 一字大小的未带正负号整数 | LPARAM | 做为窗口函数或callback函数的一个参数 |
WPARAM | 窗口函数的callback函数的参数(一字) | WNDPROC | 指向一个窗口函数 |
POSITION | MFC collection classes中的元素位置 | BSTR | 字符指针 |
指针均为32bit大小 | LPCRECT | 指向一个不变的RECT 结构 |
5.把MFC 想象为第四代语言,单单一个类别就帮我们做掉原先要以一大堆APIs 才能完成的事情。
Class Library 可以定义为「一组具备对象导向性质的类别,它们使应用程序的某些功能实现起来容易一些,这些功能包括数值运算与数据结构、绘图、内存管理等等等;这些类别可以一片一片毫无瓜葛地并入应用程序内」。
GUI toolkit 的程序接口是程序导向而非对象导向。而且它的功能大都集中在图形与UI 接口上。
6.PC 世界里出了三套C++ Application Frameworks,并且有愈多愈多的趋势。这三套是Microsoft 的MFC (Microsoft Foundation Classes ),Borland 的OWL (ObjectWindowLibrary),以及IBM VisualAge C++ 的Open Class Library。