【MFC编程(一)】MFC概述

文章目录


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函数,如:

    c 复制代码
    ::GetModuleHandle(NULL);
  • MFC库的全局函数以Afx开头函数,如:

    c 复制代码
    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>

cpp 复制代码
/*============================================================================*/
// Classes declared in <afx.h>

struct CRuntimeClass;          // object type information

class CObject;                        // the root of all objects classes

	class CException;                 // the root of all exceptions
		class CArchiveException;      // archive exception
		class CFileException;         // file exception
		class CSimpleException;
			class CMemoryException;       // out-of-memory exception
			class CNotSupportedException; // feature not supported exception
			class CInvalidArgException;	  // one of the parameters to the function is invalid

	class CFile;                      // raw binary file
		class CStdioFile;             // buffered stdio text/binary file
		class CMemFile;               // memory based file

// Non CObject classes
struct CFileStatus;                   // file status information
struct CMemoryState;                  // diagnostic memory support

class CArchive;                       // object persistence tool
class CDumpContext;                   // object diagnostic dumping

/*============================================================================*/

Classes declared in <afxwin.h>

cpp 复制代码
/*============================================================================*/
// Classes declared in <afxwin.h>

//CObject
	//CException
		//CSimpleException
			class CResourceException;// Win resource failure exception
			class CUserException;    // Message Box alert and stop operation

	class CGdiObject;            // CDC drawing tool
		class CPen;              // a pen / HPEN wrapper
		class CBrush;            // a brush / HBRUSH wrapper
		class CFont;             // a font / HFONT wrapper
		class CBitmap;           // a bitmap / HBITMAP wrapper
		class CPalette;          // a palette / HPALLETE wrapper
		class CRgn;              // a region / HRGN wrapper

	class CDC;                   // a Display Context / HDC wrapper
		class CClientDC;         // CDC for client of window
		class CWindowDC;         // CDC for entire window
		class CPaintDC;          // embeddable BeginPaint struct helper

	class CImageList;            // an image list / HIMAGELIST wrapper

	class CMenu;                 // a menu / HMENU wrapper

	class CCmdTarget;            // a target for user commands
		class CWnd;                 // a window / HWND wrapper
			class CDialog;          // a dialog

			// standard windows controls
			class CStatic;          // Static control
			class CButton;          // Button control
			class CListBox;         // ListBox control
				class CCheckListBox;// special listbox with checks
			class CComboBox;        // ComboBox control
			class CEdit;            // Edit control
			class CScrollBar;       // ScrollBar control

			class CMFCPreviewCtrlImpl; // helper window for DLL implementation of Rich Preview

			// frame windows
			class CFrameWnd;        // standard SDI frame
				class CMDIFrameWnd; // standard MDI frame
				class CMDIChildWnd; // standard MDI child
				class CMiniFrameWnd;// half-height caption frame wnd

			// views on a document
			class CView;            // a view on a document
				class CScrollView;  // a scrolling view

		class CWinThread;           // thread base class
			class CWinApp;          // application base class

		class CDocTemplate;         // template for document creation
			class CSingleDocTemplate;// SDI support
			class CMultiDocTemplate; // MDI support

		class CDocument;            // main document abstraction
		class 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 object

struct COleControlSiteOrWnd; // ActiveX dialog control helper


class 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类是多线程应用程序的线程类的直接基类。

CWinAppCWinThread类的派生类,封装了基于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类。

相关推荐
zhangpz_1 分钟前
c ++零基础可视化——vector
c++·算法
萨达大13 分钟前
23种设计模式-模板方法(Template Method)设计模式
java·c++·设计模式·软考·模板方法模式·软件设计师·行为型设计模式
刀鋒偏冷30 分钟前
ninja: error: ‘/opt/homebrew/Cellar/opensslxxx/xx/lib/libssl.dylib
c++
huaqianzkh1 小时前
学习C#中的Parallel类
windows·microsoft·c#
理论最高的吻1 小时前
98. 验证二叉搜索树【 力扣(LeetCode) 】
数据结构·c++·算法·leetcode·职场和发展·二叉树·c
沈小农学编程1 小时前
【LeetCode面试150】——202快乐数
c++·python·算法·leetcode·面试·职场和发展
ZZZ_O^O1 小时前
【动态规划-卡特兰数——96.不同的二叉搜索树】
c++·学习·算法·leetcode·动态规划
机器视觉知识推荐、就业指导2 小时前
C++设计模式:原型模式(Prototype)
c++·设计模式·原型模式
feiyangqingyun2 小时前
Qt/C++离线地图的加载和交互/可以离线使用/百度和天地图离线/支持手机上运行
c++·qt·qt天地图·qt离线地图·qt地图导航
MinBadGuy3 小时前
【GeekBand】C++设计模式笔记13_Flyweight_享元模式
c++·设计模式