b) CWnd和CCmdTarget的派生类
c)(不是从CObject派生的)独立类 图2-8 MFC 9.0 功能包类库的层次结构图
★ 为Visual C++ 2008 Feature Pack中新增加的类。
26
Managers、Control Support和Helpper类都提供对单个控件或控件组的逻辑与数据支持。 管理器类的名称中含单词“Manager”,它们通常可组合和协调被单个控件另外处理的功能。
除了CWin32Window为托管类型外,其余的MFC类全为本地类型。
2.2.4 主要类
下面是一些主要的MFC类及其主要派生类的简单介绍:
1.根类CObject
MFC中大多数类都是从基类CObject(对象)派生的,只有一些简单数据结构(点、矩形、尺寸、串、时间)等不是由CObject派生的。
CObject类可提供下列基础服务:
? 序列化(Serialization,把对象存入文件/从文件中提取对象)支持。 ? 在运行时的类信息(识别对象的类型)。 ? 对象诊断信息输出。
? 与类组(collection classes)的兼容性。
2.应用程序构架类
MFC的应用程序构架类(Application Architecture Classes)包括可接收和响应消息对象类的基类CCmdTarget(命令目标)及其若干派生类CWinApp、CDocument和CWnd等。
? CWinApp(Windows应用程序)类是应用程序的入口主程序类(其中封装并隐藏
了WinMain函数),负责初始化和运行应用程序。
? CDocument(文档)类对应于用户文件,支持对文件的创建、装入和保存。 ? CWnd(窗口)类是所有窗口的基类。
3.窗口类CWnd
CWnd类是从CCmdTarget类派生的窗口基类,它封装了一个窗口句柄,定义了消息处理机制,并提供了操作窗口所必须的成员函数。
这里的窗口(window)为广义的概念,是指一种具有矩形可视界面的图形对象,包括基本窗口(无标题条和边框的一个矩形区域,可用于绘制图形和输出文本串等,如窗口的客
27
户区)、普通的(框架)窗口(有标题条和边框,如子窗口和对话框)、(主)框架窗口(含菜单条、工具条和状态条等,如程序的主窗口)、各种控件(如按钮、单选钮、复选框、文本编辑框、列表框、工具条)等。
CWnd派生的主要窗口类包括:
? CFrameWnd类(框架窗口)——框架窗口与基本窗口的差别是包含菜单、工具条
和状态条等组合控件,是SDI(Single-Document Interface,单文档界面)的主窗口,也是下面两个多文档界面框架窗口的基类。
? CMDIFrameWnd类(多文档界面框架窗口)——MDI (Multiple-Document
Interface,多文档界面)的主窗口,MDI可在其用户区打开多个文档子窗口。 ? CMDIChildWnd类(多文档界面子窗口)——MDI的文档子窗口,对应于一
个文档。
? CControlBar类(控制条)——是CToolBar(工具条)与CStatusBar(状态条)的
基类。
? CView类(视图)——负责窗口所对应文档的绘制。带滚动条的CScrollView类是
其主要的派生类,CEditView(文档编辑视图)类也是从其派生类派生的。 ? CDialog类(对话框)——是公用对话框(文件、颜色、字体、查找/替换等)和用
户自定义对话框的基类。
? 控件类(Control Classes)——都是从CWnd派生的,包括:CButton(按钮)、CStatic
(静态文本框)、CEdit(编辑框)、CListBox(列表框)、CComboBox(组合框)、CScrollBar(滚动条)等类。
4.图形绘制对象类CGdiObject
CGdiObject类(图形设备接口对象)提供大量GDI函数,可用于其各种派生类中,如:CPen(画笔)、CBrush(画刷)、CFont(字体)、CBitmap(位图)、CPalette(调色板)、CRng(绘图区域)。
5.设备上下文类CDC
DC(Device-Context,设备上下文/绘图环境/设备描述表)是由GDI管理的一种数据结构,直接从CObject派生的CDC是对DC的封装,保存着(显示/打印)设备的属性、绘图
28
的状态和多种绘图工具,并提供了多种简单图形的绘制函数。它还是若干具体DC类的基类,CDC的派生类有:
? CPaintDC类(绘制DC)——其构造函数调用BeginPaint函数,而析构函数调用
EndPaint函数,简化了CDC对象的生成与销毁过程。
? CClientDC(客户区DC)——仅在客户区绘图,其构造函数调用GetDC函数,而
析构函数调用ReleaseDC函数,也简化了CDC对象的生成与释放过程。 ? CWindowDC(窗口DC)——可在整个窗口范围(包括框架、菜单、工具条、状
态条和其他控件)内绘图。
不过,这些派生类在本书中很少涉及,我们使用的主要是基本的CDC类。
6.其他常用类
直接从CObject派生的常用类还有:CFile(文件)、CMenu(菜单)。
不是从CObject派生的独立类中常用的有:CArchive(存档)、CPoint(点)、CRect(矩形)、CSize(尺寸)、CString(串)、CTime(时间)等。
2.2.5 文档/视图结构
MFC不仅封装了大部分Windows API,而且还提供了实用的应用程序架构,其核心是文档/视图结构。文档/视图结构将应用程序中的用户数据(文档)与数据的显示(视图)分开,可分解程序的功能以降低编写和维护代码的复杂度,详见第12章“文档与视图”。
在MFC程序中,应用程序(application)对应于从MFC的CWinApp类派生的应用程序类C*App(其中的*为程序的项目名串,如Test,下同),文档(document)对应于从MFC的CDocument类派生的文档类C*Doc,视图(view)对应于从MFC的CView等类派生的视图类C*View,而视图类又对应于框架窗口的客户区,作为应用程序界面的主框架窗口则对应于从MFC的CFrameWnd类派生的CMainFrame类,参见图2-9和图2-10。
主框架窗口 CMainFrame 视图(客户区) C*View 应用程序 C*App 文档(用户数据) C*Doc 图2-9 MFC应用程序架构中的文档/视图结构
29
MFC类 CObject CCmdTarget CWinTread CWinApp CFrameWnd CWnd CView CDocTemplate CDocument CSingleDocTemplatCMultiDocTemplate CMDIFrameWnd CMDIChildWnd CScrollView CTestApp CMainFrame CChildFrame CTestView 你的应用程序类 CTestDoc 图2-10 传统MFC应用程序项目(Test)中的主要类及其基类
2.3 API编程简介
为了能更好地理解和掌握MFC编程的思路和方法,有必要对Windows API编程有一定的了解。本节先罗列一些API中常用的数据类型、变量和常量的定义,接着给出若干常用的函数与数据结构,然后编写一个简单的示例程序,最后说明开发API程序的具体步骤。
2.3.1 数据类型和常量
在Windows API中,为了跨平台(Win16/Win32/Win64)和使用方便,定义了若干数据类型和基本常量(windef.h):
1.基本类型的重定义(Win32 API)
typedef int BOOL; // 布尔(标准C++中的对应关键字为bool) typedef char CHAR; // 字符(8位有符号字符)
typedef unsigned char BYTE; // 字节(8位无符号字符) typedef short SHORT; // 短整数(16位有符号短整数) typedef unsigned short WORD; // 字(16位无符号短整数) typedef int INT; // 整数(32位有符号整数)
typedef unsigned int UINT; // 无符号整数(32位无符号整数)
30