文章目录
- MFC概述
- MFC组成
- MFC对比Windows API
- MFC类库
- 基类CObject
- 命令发送类CCmdTarget
- 应用程序结构类
- 应用程序线程支持类CWinThread/CWinApp
- 文档类CDocument
- 文档模板类CDocTemplate
- 窗口类
- 窗口基类CWnd
- 边框窗口类CFrameWnd
- 视图类CView
MFC概述
MFC(Microsoft Foundation Classes Library,微软基础类库)是微软公司推出的一套用于Windows平台的C++类库,它基于Win32 API进行封装,提供了面向对象的编程接口,旨在简化Windows应用程序的开发过程。通过MFC,开发者可以不必直接与底层的Win32 API打交道,而是利用MFC提供的类和对象来快速构建出具有标准用户界面的应用程序。
VC++全称Visual C++,是由微软提供的C++开发工具,是用C++语言编写程序的工具平台。
VC++不仅是一个编译器更是一个集成开发环境,包括编辑器、调试器和编译器等,一般它包含在Visual Studio中。
-
封装特性
MFC类库构成了MFC框架。这些C++类库封装了WIN32应用程序编程接口以及Windows应用程序各种特性。- 对Win32应用程序接口的封装
- 对应用程序概念的封装
- 对COM/OLE特性的封装
- 对ODBC功能的封装
-
继承特性
MFC抽象出了众多类的共同特性,并设计出一些基类作为实现其他类的基础。- CObject类是MFC的根类,绝大多数类是其派生的,CObject实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持等等。所有从CObject派生的类都可以具备CObject所拥有的特性。
- CCmdTarget类派生自CObject类,它封装了一些属性和方法,提供了消息处理的架构。任何可以处理消息的类都是从CCmdTarget类派生。
-
虚函数和动态约束
作为C++类库,MFC自然支持虚函数和动态约束。但作为一个编程框架必须要解决的是效率问题:如果MFC仅仅通过虚函数来支持动态约束必然会产生大量的虚函数表这样编程框架过于臃肿而且消耗更多的内存。但是MFC建立了消息映射机制这样降低了内存的使用却大大提高了效率。消息映射是一个将消息和成员函数相互关联的表,当应用程序的框架窗口接收到一个消息时,MFC将搜索该窗口的消息映射,如果存在一个处理消息的处理程序,那么就调用该处理程序.
它通过宏来实现消息到成员函数的映射,而且这些函数不必是虚拟的成员函数,这样不需要为消息映射函数生成一个很大的虚拟函数表(V表),节省内存。
相关概念:
OLE技术
ATL技术
MFC组成
MFC由两大部分组成:一是通常所说的C++类库,是MFC类库的主体部分,这些类构成了MFC应用程序框架。二是MFC预定义宏、全局变量和全局函数,是MFC类库的辅助部分,它们都是用MFC进行Windows应用程序开发的不可缺少的组成部分。
同时,MFC也支持对底层Win32 API的直接调用。
- 双冒号开头函数为win32的API函数,如:
::GetModuleHandle(NULL);
- MFC库的全局函数以Afx开头函数,如:
AfxWinInit(hModule, NULL, ::GetCommandLine());
- MFC库的全局变量以“afx”为前缀。
- MFC宏主要功能:消息映射、运行时对象类型服务、诊断服务、异常处理。
常用头文件
(1)afx.h 将其他MFC头文件包含在内
(2)afxwin.h 包含了各种MFC窗口类,包含了afx.h和windows.h
(3)afxext.h 包含了扩展窗口类的支持,如:工具栏和状态栏
MFC对比Windows API
MFC Object和Windows Object的对应关系:
描述 | Windows Handle 句柄 | MFC Object |
---|---|---|
窗口 | HWND | CWnd |
设备上下文 | HDC | CDC |
菜单 | HMENU | CMenu |
画笔 | HPEN | CPen |
画刷 | HBRUSH | CBrush |
字体 | HFONT | CFont |
位图 | HBITMAP | CBitmap |
调色板 | HPALETTE | CPalette |
区域 | HRGN | CRgn |
套接字 | SOCKET | CSocket |
MFC类库
MSDN 手册
Classes declared in <afx.h>
/*============================================================================*/
// Classes declared in <afx.h>struct CRuntimeClass; // object type informationclass CObject; // the root of all objects classesclass CException; // the root of all exceptionsclass CArchiveException; // archive exceptionclass CFileException; // file exceptionclass CSimpleException;class CMemoryException; // out-of-memory exceptionclass CNotSupportedException; // feature not supported exceptionclass CInvalidArgException; // one of the parameters to the function is invalidclass CFile; // raw binary fileclass CStdioFile; // buffered stdio text/binary fileclass CMemFile; // memory based file// Non CObject classes
struct CFileStatus; // file status information
struct CMemoryState; // diagnostic memory supportclass CArchive; // object persistence tool
class CDumpContext; // object diagnostic dumping/*============================================================================*/
Classes declared in <afxwin.h>
/*============================================================================*/
// Classes declared in <afxwin.h>//CObject//CException//CSimpleExceptionclass CResourceException;// Win resource failure exceptionclass CUserException; // Message Box alert and stop operationclass CGdiObject; // CDC drawing toolclass CPen; // a pen / HPEN wrapperclass CBrush; // a brush / HBRUSH wrapperclass CFont; // a font / HFONT wrapperclass CBitmap; // a bitmap / HBITMAP wrapperclass CPalette; // a palette / HPALLETE wrapperclass CRgn; // a region / HRGN wrapperclass CDC; // a Display Context / HDC wrapperclass CClientDC; // CDC for client of windowclass CWindowDC; // CDC for entire windowclass CPaintDC; // embeddable BeginPaint struct helperclass CImageList; // an image list / HIMAGELIST wrapperclass CMenu; // a menu / HMENU wrapperclass CCmdTarget; // a target for user commandsclass CWnd; // a window / HWND wrapperclass CDialog; // a dialog// standard windows controlsclass CStatic; // Static controlclass CButton; // Button controlclass CListBox; // ListBox controlclass CCheckListBox;// special listbox with checksclass CComboBox; // ComboBox controlclass CEdit; // Edit controlclass CScrollBar; // ScrollBar controlclass CMFCPreviewCtrlImpl; // helper window for DLL implementation of Rich Preview// frame windowsclass CFrameWnd; // standard SDI frameclass CMDIFrameWnd; // standard MDI frameclass CMDIChildWnd; // standard MDI childclass CMiniFrameWnd;// half-height caption frame wnd// views on a documentclass CView; // a view on a documentclass CScrollView; // a scrolling viewclass CWinThread; // thread base classclass CWinApp; // application base classclass CDocTemplate; // template for document creationclass CSingleDocTemplate;// SDI supportclass CMultiDocTemplate; // MDI supportclass CDocument; // main document abstractionclass CMFCFilterChunkValueImpl; // search/organize/preview/thumbnail support - filter chunk value implementation// Helper classes
class CCmdUI; // Menu/button enabling
class CDataExchange; // Data exchange and validation context
class CCommandLineInfo; // CommandLine parsing helper
class CDocManager; // CDocTemplate manager objectstruct COleControlSiteOrWnd; // ActiveX dialog control helperclass CControlCreationInfo; //Used in CWnd::CreateControl overloads.class CVariantBoolConverter;
class CMFCDynamicLayout;/*============================================================================*/
基类CObject
CObject类是大多数MFC类的最终基类,它们都继承了CObject类的三个主要特征:
(1)在运行时识别对象所属的类
(2)支持串行化,把对象存入文件中及从文件中读取对象
(3)在运行时打印诊断信息
每个从CObject类派生的类还有一个相关的CRuntimeClass结构,可以在运行时获取对象的信息。通过对RUNTIME_CLASS
宏的调用可获得与指定类对应的CRuntimeClass结构。
用户也可以直接从CObject类派生自已的类以获得这些特性。为此,应遵循以下步骤:
(1) 在类声明中包含宏DECLARE_SERIAL;
(2) 为类提供一个默认的构造函数,这是一个无参数的构造函数。
(3) 在用来定义类成员函数的C++源文件中,包含宏IMPLEMENT_SERIAL。
(4) 重载成员函数Serialize()。
命令发送类CCmdTarget
命令发送类CCmdTarget封装了用户通过选择菜单或工具栏按钮向应用程序发送命令的界面。封装了MFC消息映射机制,支持命令和消息的自动发送,保证命令和消息正确发送到目的地。
命令发送类CCmdTarget从CObject类派生,是应用程序结构类和窗口类的基类。但CCmdTarget类在应用程序中很少直接使用。
CCmdUI类是一个与CCmdTarget类相关的有特殊用途的支持类,它封装了用于更新用户接口对象(如菜单项和工具栏按钮)的可编程界面,用在CCmdTarget类派生类的ON_UPDATE_COMMAND_UI
控制函数中,该类没有任何基类。
应用程序结构类
应用程序结构类(Application Architecture Class)提供了应用程序的几乎所有通用功能,它们构成了windows应用程序的主要框架。我们通过这些类的派生类,添加新成员函数或重载现有成员函数以实现需要的功能,从而构造应用程序框架。
应用程序线程支持类CWinThread/CWinApp
MFC支持多线程。所有的应用程序至少有一个线程,这个线程由CWinApp类的对象使用,被称为主线程。每个应用程序有且只有一个CWinApp类或其派生类的全局对象,它在程序运行中协调基他对象的动作。
CWinThread
类是所有线程类的基类,封装了操作应用程序的多线程功能。CWinThread
类是多线程应用程序的线程类的直接基类。
CWinApp
是CWinThread
类的派生类,封装了基于MFC的windows应用程序的初始化、运行及终止等功能。CWinApp
的全局对象控制着整个应用程序的流程。
CWinApp
类取代了WinMain()
主函数在SDK应用程序中的地位。传统SDK应用程序WinMain()函数完成的工作。现在由类CWinApp的InitApplication(),InitInstance()和Run()三个成员函数承担。
文档类CDocument
文档类封装了应用程序的数据管理,文档类对象由由文档模板创建。
CDocument
类是文档类的基类,用户应用程序文档类可从CDocument类直接派生。CDocument类支持一些标准操作,如:新建文档,打开文档、和存储文档等。
文档模板类CDocTemplate
文档模板类将文档、视图及边框窗口相互联系起来,在创建新文档或视图时协调文档、视图及边框窗口的创建。
- CDocTemplate类是一个抽象基类,它为文档模板封装了基本功能,用户不能直接使用该类。
- CMultiDocTemplate为多文档接口(MDI)提供了模板。
- CSingleDocTemplate为单文档接口(SDI)提供模板。应用程序结构类还包括其他一些主要与OLE有关的类。
窗口类
窗口类包括边框窗口类、视图类、对话框类、控件类、控件栏类和属性簿类,这些类的共同之处是都封装了一个窗口句柄HWND,都是从CWnd派生的。
窗口基类CWnd
CWnd类作为所有窗口类的公共基类,包含了大量的成员函数,为窗口类提供了基本操作,这些操作包括:
- 创建和初始化窗口;
- 操纵、查询窗口状态;
- 管理窗口的尽寸、位置、标题、光标、菜单、滚动;
- 对窗口的坐标进行换算;
- 管理对话框中的控件;
- 管理windows消息;
- 操纵剪切板和OLE控制。
CWnd类的消息响应机制将WndProc函数隐藏起来,windows消息通过消息响应表自动相应的响应函数,CWnd类提供了默认的消息响应函数,在CWnd的派生类重载默认的响应函数来指定当消息发送给窗口时执行我们指定的操作。
边框窗口类CFrameWnd
当应用程序在windows环境下运行时,用户通过边框窗口与windows进行交互,边框窗口通常包含并管理其他窗口,如视图、工具栏或状态栏等。
它取代了SDK应用程序中窗口函数
WndProc()
的地位。CFrameWnd类的对象是一个框架窗口,包括边框、标题栏、菜单、最大化按钮、最小化按钮和一个激活的视图。
CFrameWnd类是边框窗口类的基类,单文档接口(SDI)的边框窗口类直接从CFrameWnd类派生。创建边框窗口可先生成CFameWnd对象,然后直接调用成员函数Create或LoadFrame,也可以利用文档模板来创建边框窗口。
CMDIFrameWnd类和CMDIChileFrameWnd类都是从CFrameWnd类派生的,分别用于支持多文档接口(MDI)的主边框窗口和子窗口。一个MDI主边框窗口包含并一个客户边框窗口(MDIClient window),客户边框窗口负责MDI子窗口的激活、最大化、最小化、恢复和删除,我们可以通过公有数据成员m_hWndMDIClient获取客户边框窗口的句柄。当有子窗口激活时,自动将菜单转换为子窗口的菜单。
CSplitterWnd类提供了分割窗口的功能,即一个窗口包含很多个面板,这些面板一般都是视图对象,也可以是其他CWnd类或其派生对象。CSplitterWnd对象一般作为边框窗口CFrameWnd或CMDIChildWnd对象的一个数据成员来使用.
CSplitterWnd类不是从CFrameWnd类派生的,而是直接从CWnd类派生。
视图类CView
视图类管理着边框窗口的客户区,为用户与windows之间提供可视接口,用于显示文档的数据,并接收来自用户键盘或鼠标的输入,提供用户与应用程序的交互接口,还允许用户对数据预览和打印。视图一般通过文档模板与文档相关联。
CView类是视图类的基类。通常的应用程序直接从CView类派生自已的视图类。其他的具有特殊功能的视图类是由CView类派生的如下视图提供。
CScrollView类支持可滚动的视图,管理视图的尽寸和映射模式,自动响应滚动条和键盘的滚动消息。
CCtrlView类及其派生类CEditView,CListView,CTreeView和CRichEditView,将文档–视图模型应用到windows95和windows nt 3.51以后版本所支持的通用控件上,使得在视图中使用控件CEdit,CList,CRichEdit的功能。
CFormView类是CScrollView类的派生类,该类支持基于对话框资源的视图。CFormView类还派生了分别用于ODBC数据库、DAO数据库、数据库记录和WebBrowser控件的CRecordView类、CDaoRecordView类、COleDBRecordView类和CHtmlView类。