文章目录
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应用程序编程接口(
Win32 API
)以及Windows应用程序各种特性。- 对
Win32 API
的封装 - 对应用程序概念的封装
- 对COM/OLE特性的封装
- 对ODBC功能的封装
- 对
-
继承特性: MFC抽象出了众多类的共同特性,并设计出一些基类作为实现其他类的基础。
CObject
类是MFC的根类,绝大多数类是其派生的,CObject
实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持等等。所有从CObject
派生的类都可以具备CObject
所拥有的特性。CCmdTarget
类派生自CObject
类,它封装了一些属性和方法,提供了消息处理的架构。任何可以处理消息的类都是从CCmdTarget
类派生。
-
虚函数和动态约束: 作为C++类库,MFC自然支持虚函数和动态约束。但作为一个编程框架必须要解决的是效率问题:如果MFC仅仅通过虚函数来支持动态约束必然会产生大量的虚函数表这样编程框架过于臃肿而且消耗更多的内存。但是MFC建立了消息映射机制这样降低了内存的使用却大大提高了效率。
消息映射是一个将消息和成员函数相互关联的表,当应用程序的框架窗口接收到一个消息时,MFC将搜索该窗口的消息映射,如果存在一个处理消息的处理程序,那么就调用该处理程序。它通过宏来实现消息到成员函数的映射,而且这些函数不必是虚拟的成员函数,这样不需要为消息映射函数生成一个很大的虚拟函数表(V表),节省内存。
BCGControlBarPro库概述
BCGControlBarPro 是一个功能强大的MFC扩展库,专为开发者提供高度定制化的用户界面和丰富的交互功能。该库集合了大量经过精心设计的界面元素,从基本的按钮和列表框到高级的图表和网格控件,支持各种UI增强功能。提供了一个全面的解决方案来设计和实现现代用户界面。它通过提供 MFC 的扩展功能,来增强基于Windows的应用程序的外观和用户体验。
BCGControlBarPro 库作为一套为MFC(Microsoft Foundation Classes)应用程序提供丰富界面组件的解决方案,为开发者提供了高度可定制和扩展的控件,能够帮助用户轻松实现应用程序的视觉效果和用户体验升级。该库的控件可以分为两类:标准控件 和扩展控件。
- 标准控件 :这些控件与Windows标准控件外观类似,但在功能和性能上进行了提升。它们包括按钮、编辑框、列表框等,通常能够满足大部分的用户界面设计需求。
- 扩展控件 :BCGControlBarPro 还包括许多高级控件,如树视图、网格视图、菜单、工具栏等,这些控件在外观和功能性上都远远超出了标准控件的范围。
使用 BCGControlBarPro 库进行界面设计,可以遵循以下几个步骤:
- 集成库到项目中 :首先需要将 BCGControlBarPro 库集成到现有的MFC项目中,这涉及添加库文件、设置编译器和链接器选项等。
- 利用控件属性 :在对话框编辑器或资源编辑器中,拖放 BCGControlBarPro 提供的控件,并通过属性页对控件进行设置。
- 编写代码进行自定义 :除了界面编辑器中的视觉设计外,还需要编写相应的事件处理代码来响应用户的操作。
MFC组成
MFC由两大部分组成:
(一)是通常所说的C++类库,是MFC类库的主体部分,这些类构成了MFC应用程序框架。
(二)是MFC预定义宏、全局变量和全局函数,是MFC类库的辅助部分,它们都是用MFC进行Windows应用程序开发的不可缺少的组成部分。
- 双冒号开头函数为
Win32 API
函数(MFC也支持对底层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
包含了扩展窗口类的支持,如:工具栏和状态栏
(4)afxcmn.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 |
常用Afx全局函数
MFC程序也经常调用API函数
AfxAbort
:无条件地终止一应用程序;通常在不可恢复错误发生时调用AfxBeginThread
:创建新的线程并开始执行它AfxEndThread
:终止当前执行的线程AfxMessageBox
:显示Windows消息框AfxGetApp
:返回指向应用程序对象的指针AfxGetAppName
:返回应用程序的名称AfxGetMainWnd
:返回指向应用程序主窗口的指针AfxGetInstanceHandle
:返回标识当前应用程序实例的句柄AfxRegisterWndClass
:为MFC应用程序注册自定义的WNDCLASS类
MFC类的分层结构
Classes declared in <afx.h>
/*============================================================================*/
// 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>
/*============================================================================*/
// 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类的三个主要特征:
- 在运行时识别对象所属的类
- 支持串行化,把对象存入文件中及从文件中读取对象
- 在运行时打印诊断信息
每个从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
类。