我知道一些C和C,而我现在正在处理的项目是很多MFC编程。有人能告诉我学习MFC的先决条件。

另外,最好的资料来源是什么?

任何特定的书或视频系列?

我知道这个问题太笼统,但答案可能会帮助我(或者正在挖掘MFC的任何人)

谢谢!

1好问题!

tl;dr:学习Win32 – 按顺序。

到目前为止,MFC最重要的先决条件是对Windows API(有时也称为Win32 API)的坚定理解。您还需要熟悉C的几个关键概念,并使用工具亲密接触。我提出的先决条件清单是:

>在Windows API开发中获得坚实的背景。
熟悉C的相关概念。
>了解工具。

以下是这些步骤的缺陷,其中包含附加信息的链接。

Windows API:

Windows API通过C接口公开所有服务。因此资源管理往往是繁琐的锅炉代码。并且在源代码中可见(有时在阅读代码时有一个难以置信的奖金)。 MFC在很大程度上是围绕Windows API的自动资源管理包装器(和实用程序库),隐藏了大部分的资源管理和类型转换。要流利的MFC,你必须明白它隐藏的东西。

要开始使用Windows API,所有您需要的是我将推荐theForger’s Win32 API Tutorial(forgey forgey的名声)的主要组件的快速下载。它涵盖消息处理,窗口控件,控件和GDI,并建立了坚实的基础。如果您想投入更多时间来探索Windows API,那么迄今为止最好的资源可能还是Charles Petzold的Programming Windows(不要与managed Petzold混淆)。 MSDN也是一个很好的资源,以获得概述以及特定领域的详细文档,如:

> Message Handling
> Windowing
> User Interaction
> Windows Controls

2.关键C概念:

MFC是用C来实现的。虽然它早于官方的C标准,你不会在那里找到太多有趣的生意。很少的模板代码,当然没有一个新的C 11功能。与基本的C概念的亲密关系将使您有很长的路要走。

如前所述,MFC在很大程度上是围绕Windows API的资源管理包装。通常,Windows API资源和MFC对象之间有直接映射(如HWNDCWndHDCCDC)。如果您了解构造函数,析构函数和对象生命周期,那么您几乎都在该部门中设置。

当使用MFC的基于模板的容器(如CMap)时,您将自然会暴露于模板。没有什么太涉及那里,只是非常基本的类型参数化来重用容器代码并启用类型安全的元素访问。 MFC容器介绍可以在这里找到:Collections。

异常在MFC中很少使用,主要是在访问文件或序列化数据时。你还应该知道如何写异常安全的代码;您将在非平凡应用程序中看到异常。概述可以在Exception Handling in MFC找到。

一个不是C的一部分但在整个MFC中广泛使用的一个区域是预处理器。不管你的MFC应用程序如何微不足道,都会有宏。您必须非常了解预处理器语法以及预处理器的运行方式。

工具:

虽然可以单独使用记事本编写MFC应用程序,但是这样做肯定不是很有效率。纯文本编辑器可能是学习平台的好主意,但是当遇到里程碑和截止日期时,您肯定会使用强大的IDE。

MFC几乎意味着使用Visual Studio,我会假设这是你正在使用的。如果您使用VS6或VS2010(或更高版本),您将可以访问MFC Class Wizard.这是您将经常使用的工具。要安全地操作它,你必须熟悉它为你生成的代码。玩弄它,检查生成的代码,并尝试构建它的心理模型。如果没有意义,你应该稍后回来。

MFC类向导几乎肯定会生成预处理器代码。它隐藏了大量复杂性,您需要了解才能安全使用。使用IDE浏览预处理器宏,尝试在您的头脑中展开它们,并查看您是否理解结果代码。如果解决宏调用困难,编译器会使用/P (Preprocess to a File)编译器选项为您输出预处理代码。

有时您必须查看或调试MFC源代码。为了使源代码可用于源浏览和调试器,您必须设置VC目录以包括以下内容(如果尚未存在):

$(VCInstallDir)atlmfc\src\mfc
$(VCInstallDir)atlmfc\src\mfcm
$(VCInstallDir)atlmfc\src\atl

根据IDE,这可以通过工具 – >选项:项目和解决方案 – > VC目录或项目设置的属性表。

寻求帮助:虽然MSDN是文档的最佳资源,但MFC部分的感觉就像是处于维护模式,并没有像Windows api文档那样受到重视。如果您发现MFC文档缺少查找相应的Windows api文档,例如CWnd::OnNcDestroyWM_NCDESTROY.后者包含有关窗口收到此消息的有用信息。

学习MFC

学习MFC的综合资源是Jeff Prosise’Programming Windows with MFC.虽然它已经过时(1999年发布),但是今天的概念仍然有效。它概述了MFC的概念,并深入实施细节。如果您发现自己正在努力处理这本书为您生成的(预处理器)代码。

作为一个有价值的在线资源,MSDN提供了有关MFC开发任何方面的信息。主要概念包括:

> Message Handling and Mapping
> User Interface元素

> Windows
> Dialog Boxes

> Serialization in MFC

完整的列表可以在Concepts找到。

Windows – 学习MFC编程的先决条件的更多相关文章

  1. windows – 以具有SVN修订号的MFC应用程序编程更新FILEVERSION

    如何以编程方式更新MFC应用程序中的FILeverSION字符串?.rc文件可以#include头文件,就像.c文件一样.我有一个自动生成的version.h文件,它定义了以下内容:然后我只有我的.rc文件#include“version.h”并使用这些定义.我没有尝试过MFC项目的这种技术.可能需要将VS_VERSION_INFO资源移动到.rc2文件.

  2. 是否有任何理由在.NET上使用Win32 API(在C或C中)?

    我正在完成暑期工作,为行李扫描仪编写图形软件.一切都在.NET或MFC中完成,使用普通C进行硬件通信.我有时使用Win32API调用来提高表单或控件的性能.我只有一年的CS课程,但我对Win32API很着迷–它比我想象的要大得多,也更强大..NET是否只是隐藏了Win32API的所有“乏味”或底层工作?最终软件在.NET中消耗更多系统资源还是执行速度更慢?

  3. MFC多字节字符集中使用正则验证姓名等实现方法

    在VS2010中使用MFC开发,工程为多字节字符集对于中文姓名的增则表达式验证,比较麻烦,我采用了间接的处理方式,验证字符串中不含有数字等进行了处理。

  4. MFC中使用正则表达式

    但是在转换时忽略了CString结束后的一个换行符,结果费了好长时间。解决方法:if{sLinetmp=sLine.Left;}2、我们经常将一个Cstring转换为C++标准库中的std::string方法如下:CstringsLine;std::stringsmail=sLine;3、在使用正则表达式时用\\s表示空格,而不是\s,切记!!

  5. MFC中用正则表达式进行有效性验证

    一个正则表达式可以替换成打甚至上百行过程代码。MFC在有效性验证方面所能做到的很有限。MFC对此无能为力。当我第一次用正则表达式实现有效性验证时,我只要写一个函数即可,就像这样:voidDDV_Regex{if{CMRegexr;if(!r.Match.Success()){pDX->Fail();//throwsexception}}}这使你很容易象下面这样用正则表达式验证输入:好酷啊,仅用四行代码就搞掂。此外,在对DDV的调用中,我不想将正则表达式写死在代码中。当然,它还易于使用,借助正则表达式进行验

  6. MFC扩展DLL

    前文我们对非MFCDLL和MFC规则DLL进行了介绍,现在开始详细分析DLL的最后一种类型――MFC扩展DLL。MFC扩展DLL的含义在于它是MFC的扩展,其主要功能是实现从现有MFC库类中派生出可重用的类。从前文可知,MFC规则DLL被MFC向导自动添加了一个CWinApp的对象,而MFC扩展DLL则不包含该对象,它只是被自动添加了DllMain函数。对于MFC扩展DLL,开发人员必须在DLL的DllMain函数中添加初始化和结束代码。

  7. 在Windows下,Qt应用程序的外观和感觉是什么?

    现在我正在寻找一种将应用程序移植到Windows的方法,并使其外观和Windows感兴趣的用户。虽然我确信MFC应用程序具有原生的外观和感觉,但我记得从MFC编码框架本身是可怕的。但是,由于我不是Windows用户,我不知道Qt应用程序是否具有Windows原生Windows的外观。您可以轻松地更改Qt应用程序的风格。在Windows和Mac上,默认样式实际上是使用本机函数绘制窗口,控件等。

  8. Windows – 学习MFC编程的先决条件

    有人能告诉我学习MFC的先决条件。到目前为止,MFC最重要的先决条件是对WindowsAPI的坚定理解。我提出的先决条件清单是:>在WindowsAPI开发中获得坚实的背景。WindowsAPI:WindowsAPI通过C接口公开所有服务。MFC在很大程度上是围绕WindowsAPI的自动资源管理包装器,隐藏了大部分的资源管理和类型转换。如前所述,MFC在很大程度上是围绕WindowsAPI的资源管理包装。通常,WindowsAPI资源和MFC对象之间有直接映射。学习MFC学习MFC的综合资源是JeffP

  9. MFC动态链接库和WIN32动态链接库 及区别

    hModule是动态库被调用时所传递过来的一个指向自己的句柄;ul_reason_for_call是一个说明动态库被调用原因的标志。当进程或者线程装载、卸载动态链接库的时候,操作系统便调用入口函数。B,隐式加载WIN32DLL并测试利用第步同样的隐式调用测试程序,就可以测试这个DLL。如下:exterMFC动态链接库和WIN32动态链接库区别:通过MFC创建DLL你必须链接MFC库,无论动态或静态,优点是如CString等,促使开发方便,缺点是静态链接臃肿,动态链接必须附带mfc库,部署不方便。

  10. 未来打样大型UI应用程序 – MFC与2008 Feature Pack或C#和Winforms?

    我们是一个小团队,所以我的建议很可能被接受为我们发展的未来方向–我想要正确的.MFC死了吗C#/Winforms的前进方向吗?还有什么我完全失踪的吗?

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部