学习MFC编程的先决条件[关闭]

2023-11-23

我懂一点 C++ 和 C,我现在正在处理的项目是大量的 MFC 编程。有经验的人可以告诉我学习MFC的前提条件吗?

另外,什么是最好的学习来源?

有什么特别的书或视频系列吗?

我知道这个问题太笼统,但答案可能对我(或任何其他正在研究 MFC 的人)有很大帮助

谢谢!


+1 好问题!

tl;dr:学习Win32 - 按此顺序。

到目前为止,MFC 最重要的先决条件是对视窗应用程序接口(有时也称为Win32 API)。您还需要熟悉 C++ 的一些关键概念并熟悉这些工具。我建议的先决条件列表是:

  1. 获得 Windows API 开发的扎实背景。
  2. 熟悉C++的相关概念。
  3. 学习工具。

以下是这些步骤的概要,以及指向其他信息的链接。

1.Windows API:

Windows API 通过 C 接口公开所有服务。因此,资源管理通常是乏味的样板代码。并且在源代码中可见(有时在阅读代码时会带来难以置信的好处)。 MFC 在很大程度上是围绕 Windows API 的自动化资源管理包装器(和实用程序库),隐藏了大部分资源管理和类型转换。要熟练使用 MFC,您必须了解它隐藏的内容。

要开始使用 Windows API,您所需要的只是快速概述我推荐的主要组件theForger 的 Win32 API 教程 (by forgey of #winprog名誉)。它涵盖消息处理, 窗口化, Controls,以及GDI,并打下坚实的基础。如果您想投入(值得)时间来更详细地探索 Windows API,那么迄今为止最好的资源可能仍然是 Charles Petzold 的编程窗口(不要与管理佩措尔德)。 MSDN 也是一个很好的资源,可以获取特定领域的概述和详细文档,例如:

  • 消息处理
  • 窗口化
  • 用户互动
  • 视窗控制

2. C++ 关键概念:

MFC是用C++实现的。虽然它早于官方 C++ 标准,但您不会在其中发现太多时髦的业务。模板代码非常少,当然也没有新奇的 C++11 功能。熟悉基本的 C++ 概念将使您受益匪浅。

如前所述,MFC 在很大程度上是 Windows API 的资源管理包装器。 Windows API 资源和 MFC 对象之间通常存在直接映射(例如HWND : CWnd, or HDC : CDC)。如果您了解构造函数、析构函数和对象生命周期,那么您就已经在该领域做好了准备。

当使用 MFC 的基于模板的容器时(例如CMap)您自然会接触到模板。其中没有涉及太多内容,只是非常基本的类型参数化以重用容器代码并启用类型安全的元素访问。 MFC容器的介绍可以在这里找到:收藏.

MFC 中很少使用异常,主要是在访问文件或序列化数据时。您仍然应该知道如何编写异常安全代码;您将在重要的应用程序中看到异常。概述可以在以下位置找到:MFC 中的异常处理.

预处理器实际上并不是 C++ 的一部分,但在整个 MFC 中广泛使用。无论您的 MFC 应用程序多么琐碎,都会有宏。您必须非常了解预处理器语法以及预处理器的运行方式。

3.工具:

虽然可以单独使用记事本编写 MFC 应用程序,但这样做的效率肯定不是很高。对于学习该平台来说,纯文本编辑器可能是一个好主意,但是当需要满足里程碑和截止日期时,您肯定会想要使用功能强大的 IDE。

MFC 几乎暗示了 Visual Studio 的使用,我假设您正在使用 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。后者包含有关窗口接收此消息的顺序的有价值的信息。

学习在线课程,掌握职场技能

Jeff Prosise 是学习 MFC 的综合资源使用 MFC 进行 Windows 编程。虽然它已经过时(1999 年发布),但这些概念至今仍然有效。它概述了 MFC 的概念并深入探讨了实现细节。如果您发现自己在生成的(预处理器)代码中遇到困难,那么这本书适合您。

作为宝贵的在线资源,MSDN 提供了有关 MFC 开发的几乎所有方面的信息。主要概念包括:

  • 消息处理和映射
  • User Interface Elements
    • Windows
    • 对话框
  • MFC 中的序列化

完整列表可在以下位置找到:Concepts.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习MFC编程的先决条件[关闭] 的相关文章

  • 使用 Powershell 命令进行文件计数

    如何使用以下命令计算特定文件夹 以及所有子文件夹 中的所有文件电源外壳命令 Get ChildItem 和 Get ChildItem
  • Windows 8.1 如何修复这个过时的代码?

    我已将我的项目从 Windows 8 0 升级到 Windows 8 1 并收到一些过时代码的警告 其中一些我已经修复了 有些还没有 这是我无法修复且找不到任何信息的最后警告的图像 所有警告都引用相同的方法 并且它说它已过时 我应该怎么做才
  • 批处理文件进度旋转轮

    我已经尝试了好几天了 似乎可以让它发挥作用 我找到了一个例子 但它使用了 CryEcho 但它不起作用 我只是想添加这个 让用户知道在 ping IP 地址时发生了什么事 我确实在这里找到了一些代码 但这让我感到困惑 因为我刚刚开始为了好玩
  • 单个 .msi Windows 软件包安装程序文件的最大大小是多少?

    我们正在对服务器进行一些上传测试 特别是接收 msi 软件包安装程序文件 目前 我可以使用有限的知识和我所拥有的 Visusl Studio 工具创建一个总大小为 2GB 的 msi 文件 但我想知道是否可以创建一个更大的文件 我的谷歌搜索
  • MY SQL - 错误代码:1010。删除数据库时出错(无法 rmdir;errno:13)

    当尝试删除 MySQL 中的数据库时 DROP DATABASE IF EXISTS temporarydata 我收到以下错误 Error Code 1010 Error dropping database can t rmdir tem
  • Windows 上的 CMake 链接共享库

    共有三个文件 m c m h和 main c File m h m h int m File m c m c include
  • 适用于 Windows 的 D-Bus 等效项

    有人知道 Windows 的 Linux D Bus 机制吗 Thanks 选择你的毒药 http msdn microsoft com en us library aa365574 28VS 85 29 aspx http msdn mi
  • 如何在本地主机上托管 Office 加载项?

    我是网络服务器的新手 我在 Windows 10 上安装了 Internet 信息服务 IIS 10 Express 我正在尝试开发 Office 加载项 以便将其托管在我使用的同一台计算机上 问题是如何在本地 Web 服务器中托管加载项
  • 使用 Inno Setup 将序列号写入文件

    我正在尝试让以下 Inno Setup 代码正常工作 Setup UserInfoPage yes Code function CheckSerial Serial String Boolean begin Result true Save
  • MFC中如何获取子菜单?

    我正在尝试获取一个子菜单 以便我可以在显示它之前对其进行更改 所以我创建了一个OnInitMenu 我的窗口的处理程序 我本来计划使用pMenu gt GetMenuItemInfo 获取子菜单 然而 这似乎行不通 为了找到我想要的菜单 我
  • 当应用程序最小化时隐藏表单

    我有一个主表单和一个状态表单 当我的应用程序中的工作正在进行时 我会显示它们 如果工作完成我就打电话Hide状态表上出现 状态表消失 当我最小化主窗体而等待窗体可见时 就会出现问题 然后两种形式都被隐藏 这就是我想要的 但是 如果工作完成时
  • Microsoft Visual Studio 10.0\VC\include\io.h 提供了什么?

    我安装了 Visual Studio 2010 它给了我 C 编译器 C Program Files x86 Microsoft Visual Studio 10 0 VC vcvarsall bat 然而 当我尝试构建一个应用程序 一个P
  • 导出的 DLL 函数未按词法排序?

    嗯 今天我遇到了一个奇怪的事情 我不久前编写了自己的 GetProcAddress 版本 用于从远程进程获取函数地址 显然我花了很多时间阅读 PE 架构来找出解决这个问题的最佳方法 根据 PECOFF v8 规范 我认为这是最新的官方规范
  • 如何使文件自我更新(Native C++)

    我将 Microsoft Visual Studio 2008 与 Windows 目标部署结合使用 我如何使文件 自我更新 我已经完成了 通过网络传输 部分 但是如何使可执行文件重写自身 基本上 我想为还包含自动更新程序的目录编写一个自动
  • 在C中找到机器的IP地址?

    Windows下C盘如何获取本机IP地址 我无法在以下代码中获取我的机器的IP地址 include
  • 如何将 Windows 窗体应用程序 (C++) 设置为具有 Aero/Glass 背景?

    我正在使用 Visual Studio 2010 Pro 用 C 创建 Windows 窗体应用程序 我想创建一个透明背景 即使用 Aero Glass 效果 类似于它围绕 Windows 照片查看器中 UI 底部的方式 此时 我已经查看了
  • 批量-用特殊字符替换字符串

    我想使用批处理文件替换文件中的字符串 该字符串是 我想用以下方式替换它 我发现了几篇帖子 比如这个 如何替换 Windows 批处理文件中的子字符串 https stackoverflow com questions 5273937但该示例
  • 如何在每个批处理脚本运行后清除变量?

    看来 由于我使用 SET 在批处理脚本中声明变量 如果我在 cmd 中运行多次 变量值将持续存在 除非我显式重置它们 我是否必须使用 setlocal 和 endlocal 来确保一次运行中的变量不会在不关闭 CMD 的情况下持续到另一次运
  • C++ 控制台键盘事件

    有什么方法可以获取 Windows 控制台中的关键事件吗 我需要一种无需 GUI 即可快速获取 keydown 和 keyup 事件的方法 我尝试过使用 getch 但它没有获取按键并等待按下某个键才返回 Use ReadConsoleIn
  • 有适用于 Windows 的 Bonjour SDK 吗?

    我想知道如何在 Windows 上实现 bonjour 以便我可以在 Windows 上设置服务器并使用 iphone 客户端 中的 bonjour 服务访问 Windows 服务器 中的文件 谁能告诉我我们是否有适用于 Windows 的

随机推荐

  • 无法绑定到“占位符”,因为它不是“ng-multiselect-dropdown”的已知属性

    我想实现自动完成功能 因此我发现的一个相同选项是使用多选下拉菜单 所以我使用了这个模块 https www npmjs com package ng multiselect dropdown 但在同上实施后 我收到这些错误 Error ER
  • 如何检查Python中的字符串中是否有*任一*字符? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我知道 if a in cat win 但有没有更好的方法来查找是否either字符串中存在两个字母 以下是一些方法 if a in cat or d in cat win if
  • 如何将逗号分隔的数字字符串转换为整数数组?

    说我有绳子1 2 3 4 5我想将其转换为整数数组 最好的方法是什么 我知道我可以使用爆炸来创建一个带有字符串的数组 但我需要数组项是整数 您可以使用array map申请intval分解字符串后的每个数组项 string 1 2 3 4
  • 使用 scrapy 蜘蛛间歇性“getrandom() 初始化失败”

    我构建了一个 scrapy 蜘蛛 scrapy 1 4 该蜘蛛是通过 django rq 和supervisord 从 django 网站按需触发的 这是正在监听 django rq 事件的supervisord 作业 reddit 用作代
  • 检索 ASP.NET 中的所有发布值

    我正在创建一个 ASP NET 应用程序 它允许用户将表单元素添加到表单内的页面 当页面发布时 通过提交按钮 我需要循环遍历表单中所有发布的值并获取值 我无法检查具体值 因为我不知道会有多少个值或它们将被称为什么 有人可以指出我获取所有发布
  • 如何将数据集拆分/分区为训练和测试数据集,例如交叉验证?

    将 NumPy 数组随机拆分为训练和测试 验证数据集的好方法是什么 类似的东西cvpartition or crossvalindMatlab 中的函数 如果你想将数据集分成两部分 你可以使用numpy random shuffle or
  • 当需要相同类型的多个实例时,使用 Unity 进行 DI

    我需要这方面的帮助 我使用 Unity 作为容器 并且想将同一类型的两个不同实例注入到我的构造函数中 class Example Example IQueue receiveQueue IQueue sendQueue IQueue 是在我
  • OrderedDict 在 Python 3.7 中会变得多余吗?

    来自Python 3 7 变更日志 插入顺序保存性质dict物体已宣布成为 Python 语言规范的正式部分 这是否意味着OrderedDict会变得多余吗 我能想到的唯一用途是保持与旧版本 Python 的向后兼容性 旧版本的 Pytho
  • Boost::Asio,SSL 连接问题

    我已经尝试解决我的问题几天了 但就是无法解决 我尝试使用 Boost Asio 库和 OpenSSL 进行 SSL 连接 有一个示例代码 如何做到这一点 http www boost org doc libs 1 55 0 doc html
  • 如何使用selenium获取特定元素的html源?

    我正在查看的页面包含 div p text 1 p h1 text 2 h1 text 3 p text 4 p div 我想获取 div 中的所有文本 除了
  • 阿特金分段筛可能吗?

    我知道可以实现埃拉托斯特尼筛法 以便它连续找到素数而没有上限 分段筛 我的问题是 阿特金 伯恩斯坦筛法可以用同样的方式实现吗 相关问题 C 如何使阿特金筛增量 然而相关问题只有1个答案 即 对于所有筛子都是不可能的 这显然是不正确的 Atk
  • 文件 InfoPlist.strings 无法打开

    谁能帮帮我吗 我应该如何修复错误 无法打开文件 InfoPlist strings 因为没有这样的文件 它是在我从 SVN 更新我的项目后出现的 实际上我的项目中有 InfoPlist strings 我不知道为什么 Xcode 没有看到它
  • 写入现有 Excel 文件

    package jexcel jxl nimit import java awt Label import java io File import java io IOException import jxl Cell import jxl
  • 删除数据表中的主键

    有没有办法从数据表中删除主键或者有没有办法先删除 PK 的约束 然后删除列本身 Thanks UPDATED dtTable Columns Add new System Data DataColumn PRIMARY KEY typeof
  • 通过伪经典实例化掌握原型继承(JavaScript)

    我正在尝试通过 JavaScript 使用继承来通过测试套件 下面是我到目前为止的代码片段 var Infant function this age 0 this color pink this food milk Infant proto
  • 将双精度型转换为 int

    转换的最佳方法是什么double to an int 应该使用演员阵容吗 如果您想要默认的向零截断行为 则可以使用强制转换 或者 您可能想使用Math Ceiling Math Round Math Floor等等 尽管之后你仍然需要演员阵
  • 将字符串转换为日期时间(使用 SSIS)

    我想将值 5 27 2013 16 42 37 490000 从平面文件 DT STR 读取 插入到 SQL Server 表的列 日期时间 中 如果我尝试在派生列中使用 DT DBDATE 或 DT DBTIMESTAMP 对其进行强制转
  • 忽略 Xcode4 中的“属性不可用”警告

    我在工具栏项中使用了很多 自定义标识符 这在 Xcode4 中很好 但在构建项目时它给了我一堆警告 属性不可用 Interface Builder 3 2 之前版本中的自定义标识符 有没有办法在Xcode4中忽略这些警告 当我搜索 真正的
  • Chart.js 中饼图的点击事件

    我有一个关于 Chart js 的问题 我使用提供的文档绘制了多个饼图 我想知道单击其中一个图表的某个切片是否可以根据该切片的值进行 ajax 调用 例如 如果这是我的data var data value 300 color F7464A
  • 学习MFC编程的先决条件[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我懂一点 C 和 C 我现在正在处理的项目是大量的 MFC 编程 有经验的人可以告诉我学习MFC的前提条件吗 另外 什么是最好的学习来源 有什么特别