微软基础类库
微软基础类库(Microsoft Foundation Classes,简称 MFC)是微软公司提供的一套 C++ 类库(class libraries),以 C++ 类的形式封装 Windows API,并附带一个应用程序框架,用于降低 Windows 平台软件的开发工作量,其中包含大量针对 Windows 句柄、内建控件与组件的封装类[1]。该库于 1992 年随 Microsoft C/C++ 7.0 编译器发布,最初以应用程序框架的名义开发,代号为 Application Framework eXtensions(AFX)[1]。在 .NET 与后续界面框架出现后,MFC 仍继续支持非托管 C++ 桌面软件的开发与维护,微软已说明该库继续获得支持,但不再增加新功能,也不再更新相关文档[2]。
定义
微软基础类库是面向 Windows 操作系统的 C++ 类库,它在保留 C 语言 Windows 应用程序编程接口(API)的前提下,用类与对象的方式重新组织这套接口[3]。它同时提供一个应用程序框架,把菜单、工具栏、状态栏、打印、数据库访问、ActiveX 控件等常见功能预先实现为可复用的类,开发者通常从这些类派生自己的类来完成具体业务[1]。
官方文档把 MFC 的设计目标归纳为几点:明显减少编写 Windows 程序所需的工作量、运行速度与直接调用 C 语言 API 大致相当、代码体积开销尽量小、能够直接调用任意 Windows C 函数,以及让已有 C 程序更容易迁移到 C++[3]。类库中的大部分类从 CObject 直接或间接派生,少数类不属于这一继承体系;Windows 应用程序里 MFC 的主包含文件是 Afxwin.h[4]。
MFC 属于非托管代码的编程框架,其类与成员不能用于在 Windows 运行时环境中执行的应用程序[2]。与单纯封装接口的辅助库不同,它还承担程序骨架的职责,若开发者关闭文档/视图支持,则菜单、工具栏、打开与保存等功能都需要自行补齐[5]。
原理
MFC 的核心机制是把 Windows 的消息驱动模型包装为对象模型。传统 Windows 程序在一个窗口过程中用庞大的 switch 语句分派消息,MFC 改用消息映射(message map)把指定消息直接对应到不同的类成员函数;官方文档指出,这种做法在此用途上比虚函数更高效,并允许由最合适的对象——应用程序、文档、视图等——来处理消息[6]。消息映射既可映射单条消息,也可映射消息范围、命令 ID 或控件 ID,WM_COMMAND 一类由菜单、工具栏按钮与快捷键产生的命令消息同样经由这一机制处理[6]。
命令消息在程序中按固定的顺序在应用程序对象、框架窗口、视图与活动文档之间传递,必要时可以改写这一路由;消息映射还提供更新用户界面对象的途径,使菜单项与工具栏按钮能依据当前上下文启用或禁用[6]。承担消息映射基础的是 CCmdTarget 类,它通过宏声明与定义映射表,并以虚函数 OnCmdMsg 构建命令传递链[7]。
文档与视图的分离是框架的另一根支柱。文档类(派生自 CDocument)负责保存或控制程序数据,并负责读写持久存储与协调数据的多个视图更新;视图类(派生自 CView)附着于某个文档,在屏幕上呈现文档内容,把用户输入解释为对文档的操作,并负责打印与打印预览的绘制[8]。框架窗口类(CFrameWnd 等)为视图提供外框,文档模板类(CDocTemplate、CSingleDocTemplate、CMultiDocTemplate)则负责按文档类型创建配套的文档、视图与框架窗口对象[8]。
应用程序对象由 CWinApp 派生,管理上述全部对象并规定初始化与清理等行为;需要后台计算等多线程时使用 CWinThread 派生的类,CWinApp 本身也源自 CWinThread,代表进程的主线程[8]。当同一份数据需要多种呈现方式(例如表格与图表)时,每个视图对象各自呈现数据,公共计算代码留在文档中,数据变化时由文档统一触发所有视图刷新[5]。
在动态库方面,MFC 程序可以编译为不使用 MFC 的 DLL、输出接口不涉及 MFC 因而可被任意程序调用的常规 DLL,以及只能动态链接、可输出 MFC 派生类的扩展 DLL;由于 DLL 与调用程序各自拥有 MFC 全局数据与句柄映射,DLL 需要在导出函数入口调用 AFX_MANAGE_STATE 把资源模块句柄切换到自身,避免双方资源互相干扰[9]。
发展历程
MFC 于 1992 年随 Microsoft C/C++ 7.0 编译器推出,面向当时 16 位的 Windows 平台;由于最初是作为应用程序框架而非单纯类库开发的,早期内部名称定为 Application Framework eXtensions(AFX),至今类名与宏中的 Afx 前缀仍沿用这一称呼[1]。其后版本随 Visual C++ 更迭,MFC 1.0 对应 Microsoft C/C++ 7.0,MFC 2.0 起改为以 mfc200.dll 等动态库形式随 Visual C++ 1.0 提供,MFC 4.0 时代对应的 mfc40.dll 曾随 Windows 95 一并发行[1]。
.NET 框架发布后,Visual Basic .NET、C# 与 Windows Forms 分流了 MFC 的部分市场份额,但 MFC 在非托管软件开发中仍有地位;在托管开发方向上,MFC 也包含了对 Windows Forms 及托管与非托管互操作的封装[1]。Windows Vista 与 Windows 7 发布后,MFC 中补充了对相应新增 Windows API 的支持[1]。
微软官方文档目前标注,MFC 库继续受到支持,但不再增加功能,也不再更新文档;同时官方说明,用于多字节字符编码(MBCS)的 MFC 动态库已不再随 Visual Studio 直接提供,而是改为以附加组件形式发布[2]。在 Visual Studio 2022 的组件清单中,MFC 仍以按工具集版本划分的独立组件形式随 v143 生成工具提供,并涵盖 x86、x64、ARM 与 ARM64 目标及 Spectre 缓解版本,部分旧版次组件被标记为超出支持期[10]。
应用
MFC 的主要用途是开发 Windows 桌面应用程序。Visual C++ 提供 MFC 应用程序向导,向导中可设定界面风格、语种、数据库开发支持、打印支持、自动化支持、ActiveX 支持、网络支持与帮助文档支持等选项,并自动生成文档、视图与框架窗口类的骨架[9]。Visual C++ 中的类向导则用于把命令与消息关联到处理函数,快速生成类的成员函数[1]。
除常规桌面程序外,MFC 的封装范围覆盖界面、图形绘制、文件与数据库访问、网络通信以及 COM 组件开发等方向。界面方面提供常用 Windows 通用控件的封装类并以消息映射规避虚函数开销;COM 方面相对 ATL 组件更大、代码不够精简,但支持的功能更多,例如含有活动文档(ActiveX Document)的封装类[9]。由于这些能力,很多商用类库在其上进一步实现了皮肤、渐变风格、多顶层窗口、属性列表等功能,C++ 社区中也有相当一部分开放源代码项目基于 MFC[9]。
MFC 常被用于长期维护的企业级软件。在这类代码库中,用户界面、打印、文件读写、设备控制、专有协议与 COM 集成往往集中由 MFC 承担,因此在考虑迁移到其他界面框架之前,通常需要先让原有代码处于可读、可维护的状态[11]。需要说明的是,MFC 常被初学者误认为 Visual C++ 开发的必选项,但它属于应用框架,只提高某些情形下的开发效率,并不能替代完整的 Win32 程序设计[4]。
局限
MFC 的封装层次较深,一些封装过程过于复杂,新用户不易迅速掌握其应用程序框架,调试时定位问题也比较困难;同时很多 MFC 对象不是线程安全的,跨线程访问这些对象需要额外编写同步代码[9]。此外,不少类依赖应用程序向导生成的代码,若在由其他类型向导建立的工程中加入 MFC 支持,难度会显著增加[9]。
平台与运行环境方面也存在边界。MFC 的类与成员不能在 Windows 运行时环境的应用中使用,其定位是传统非托管桌面程序[2]。多字节字符编码的 MFC 动态库已不随 Visual Studio 附带,需要另行安装附加组件[2]。就功能演进而言,微软已声明 MFC 只维持支持状态,不再添加新功能、也不再更新文档,因而它并不承担新界面技术探索的角色[2]。
文档/视图结构本身也并非普适。对于从 C 语言移植的程序、体量很小的工具程序,或者已经把数据处理与显示混写在一起的既有代码,强行套用这一结构往往并不划算,向导中也允许关闭文档/视图支持[12]。
参见
-
Windows API —— MFC 所封装的底层 C 语言编程接口。
-
Visual C++ —— 随附 MFC 库与应用程序向导的微软 C++ 开发工具。
-
ATL —— 微软另一套偏重轻量与 COM 组件开发的 C++ 模板库,与 MFC 可配合使用。
-
COM —— MFC 在组件开发中封装的对象模型标准。
-
Windows Forms —— .NET 框架中的桌面界面框架,分流了 MFC 的部分应用场景。
参考资料
- MFC (微软) [引用日期2026-10-29]
- mfc-desktop-applications [引用日期2026-10-29]
- 常规类设计理念 [引用日期2026-10-29]
- MFC(微软基础类库)_百度百科 [引用日期2026-10-29]
- xzaa0zw9(v=vs [引用日期2026-10-29]
- message-handling-and-mapping [引用日期2026-10-29]
- CCmdTarget [引用日期2026-10-29]
- description: "Learn more about: Document/View Architecture" [引用日期2026-10-29]
- [科普中国]-MFC - 版权归原作者所有,如有侵权,请联系我们 [引用日期2026-10-29]
- Visual Studio Build Tools workload and component IDs [引用日期2026-10-29]
- zenodo.org 上的网页 [引用日期2026-10-29]
- VS2003_CPP_it-it(PDF) [引用日期2026-10-29]