我知道一点 C++ 和 C,而我现在正在使用的项目是大量的 MFC 编程。有经验的能告诉我学习MFC的先决条件吗?
另外,什么是最好的学习资源?
有什么特别的书或视频系列吗?
我知道这个问题太笼统了,但答案可能对我(或其他任何正在研究 MFC 的人)有很大帮助
谢谢!
+1 好问题!
tl;博士:按顺序学习 Win32。
到目前为止,MFC 最重要的先决条件是对Windows API(有时也称为Win32 API)的深刻理解。您还需要熟悉 C++ 的一些关键概念并熟悉这些工具。我建议的先决条件列表是:
以下是这些步骤的概要,以及指向其他信息的链接。
1. Windows API:
Windows API 通过 C 接口公开所有服务。因此,资源管理通常是乏味的样板代码。并且在源代码中可见(有时在阅读代码时是一个令人难以置信的奖励)。MFC 在很大程度上是一个围绕 Windows API 的自动化资源管理包装器(和实用程序库),隐藏了大部分资源管理和类型转换。要精通 MFC,您必须了解它隐藏的内容。
要开始使用 Windows API,您只需要快速了解主要组件,我会推荐Forger 的 Win32 API 教程(由#winprog成名的伪造者提供)。它涵盖了消息处理、窗口化、控件和GDI,并奠定了坚实的基础。如果您想花时间更详细地探索 Windows API,那么迄今为止最好的资源可能仍然是 Charles Petzold 的Programming Windows(不要与托管 Petzold混淆)。MSDN 也是获取特定领域的概述和详细文档的好资源,例如:
2. 关键 C++ 概念:
MFC 是用 C++ 实现的。虽然它早于官方 C++ 标准,但您不会在其中找到太多时髦的业务。非常少的模板代码,当然也没有新奇的 C++11 功能。熟悉基本的 C++ 概念会让你走得很远。
如前所述,MFC 在很大程度上是围绕 Windows API 的资源管理包装器。HWND
Windows API 资源和 MFC 对象(如:CWnd
或HDC
: CDC
)之间通常存在直接映射。如果您了解构造函数、析构函数和对象生命周期,那么您几乎都已在该部门中做好了准备。
当使用 MFC 的基于模板的容器(如CMap
)时,您自然会接触到模板。那里没有太多涉及,只是非常基本的类型参数化以重用容器代码并启用类型安全的元素访问。可以在此处找到 MFC 容器的介绍:集合。
在 MFC 中很少使用异常,主要是在访问文件或序列化数据时。您仍然应该知道如何编写异常安全代码;您将在非平凡的应用程序中看到异常。可以在 MFC 中的异常处理中找到概述。
预处理器不是真正属于 C++ 的一部分,但在整个 MFC 中广泛使用的一个领域是预处理器。无论您的 MFC 应用程序多么微不足道,都会有宏。您必须非常了解预处理器语法以及预处理器的操作方式。
3.工具:
虽然可以单独使用记事本编写 MFC 应用程序,但这样做肯定不是很有效。纯文本编辑器可能是学习平台的好主意,但是当需要满足里程碑和截止日期时,您肯定会想要使用功能强大的 IDE。
MFC 几乎暗示了 Visual Studio 的使用,我假设这就是您正在使用的。如果您使用的是 VS6 或 VS2010(或更高版本),您将可以访问MFC 类向导。这是您将经常使用的工具。为了安全地操作它,您必须熟悉它为您生成的代码。玩弄它,检查生成的代码,并尝试建立它的心理模型。如果还没有意义,您应该稍后返回。
MFC 类向导几乎肯定会生成预处理器代码。它隐藏了大量的复杂性,您需要了解这些复杂性才能安全使用。使用 IDE 浏览预处理器宏,尝试在您的脑海中扩展它们,看看您是否理解生成的代码。如果您在解开宏调用时遇到困难,请让编译器使用/P(预处理到文件)编译器选项为您输出预处理代码。
有时您必须查看或调试 MFC 源代码。要使源代码可用于源代码浏览和调试器,您必须设置VC++ 目录以包含以下内容(如果尚未存在):
$(VCInstallDir)atlmfc\src\mfc
$(VCInstallDir)atlmfc\src\mfcm
$(VCInstallDir)atlmfc\src\atl
根据 IDE,这可以通过工具 -> 选项:项目和解决方案 -> VC++ 目录或项目设置的属性表来完成。
寻求帮助:虽然 MSDN 是最好的文档资源,但 MFC 部分感觉像是处于维护模式,不像 Windows API 文档那样受到关注。如果您发现缺少 MFC 文档,请改为查找相应的 Windows API 文档,例如CWnd::OnNcDestroy
vs. WM_NCDESTROY
. 后者包含有关窗口接收此消息的顺序的有价值的信息。
学习 MFC
学习 MFC 的综合资源是 Jeff Prosise 的Programming Windows with MFC。虽然它已经过时(1999 年发布),但这些概念在今天仍然有效。它概述了 MFC 的概念并深入探讨了实现细节。如果您发现自己在生成的(预处理器)代码方面遇到困难,这本书就是为您准备的。
作为一个有价值的在线资源,MSDN 提供了有关 MFC 开发的几乎任何方面的信息。主要概念包括:
完整列表可在概念中找到。
学习 MFC 最重要的先决条件是 C++,其次是了解 Windows 的工作原理。
我最喜欢的 MFC 书籍是David Kruglinski 的Inside Visual C++,他死得太早了。他的上一版涵盖了 MFC 和 Visual Studio 6,但其中的概念和大部分内容仍然有效。
要了解 Windows 是如何工作的,“Petzold”就是这本书。(Charles Petzold 的 Windows 编程)。