问题

很多人说 C++ 的 MFC 已经过时了,那新入门的人到底应该学什么?

回答
是的,很多人认为 MFC(Microsoft Foundation Classes)在现代 C++ 开发中确实已经相对过时,尤其是在开发新的、跨平台、现代化 UI 应用方面。MFC 是一个相对古老的框架,它基于 COM 模型,并且与 Windows API 紧密耦合。虽然它在很多遗留 Windows 应用中仍然发挥着重要作用,但它在学习曲线、现代编程范式支持、跨平台能力等方面存在一些挑战。

那么,对于新入门的 C++ 开发者来说,应该学习什么来构建现代化的应用程序呢?这是一个很好的问题,答案取决于你的目标和兴趣。下面我会详细地为你讲解,并提供一些更现代的选择和学习路径。

为什么 MFC 被认为过时?

在深入探讨新选择之前,理解 MFC 过时的原因有助于我们更好地理解方向:

1. Windows 平台限制: MFC 是微软官方的 Windows 应用程序开发框架,它与 Windows API 深度集成。这意味着基于 MFC 开发的应用天然是 Windows 特有的,难以移植到 macOS、Linux 或移动平台。
2. 老旧的编程范式: MFC 最初的设计理念和实现方式(如消息映射、文档/视图架构)在今天看来可能有些繁琐和不直观,与现代的面向对象、事件驱动、响应式编程等范式存在一定的距离。
3. 学习曲线陡峭: 尽管它封装了 Windows API,但要真正精通 MFC,理解其内部机制、消息处理、线程模型等,需要投入大量时间和精力,而且很多概念在现代框架中已经有了更简洁的替代方案。
4. 缺乏现代 UI/UX 支持: MFC 在创建现代、美观、响应式的用户界面方面存在局限性。虽然可以通过第三方库或自定义控件来增强,但原生支持不足。
5. 社区和生态系统: 相比于许多现代 C++ UI 框架,MFC 的社区活跃度和可用资源相对较少,尤其是在讨论新技术和最佳实践方面。
6. 语言特性支持: MFC 的设计年代较早,对 C++11, C++14, C++17, C++20 等现代 C++ 特性的支持可能不如新框架那样无缝和充分。

那么,新入门 C++ 开发者应该学什么?

这取决于你希望用 C++ 来做什么。C++ 的应用领域非常广泛,从系统底层到高性能游戏,再到嵌入式设备和桌面应用。

1. 如果你的目标是:现代桌面应用程序开发 (Windows, macOS, Linux)

这是 MFC 曾经的主要领域,但现在有许多更优秀的选择。

首选推荐:Qt 框架

为什么推荐 Qt?
跨平台性: 这是 Qt 最大的优势之一。你可以使用一套代码在 Windows, macOS, Linux, Android, iOS, 嵌入式设备等多种平台上编译和运行你的应用程序。这使得你的开发工作可以覆盖更广泛的用户群体。
成熟稳定: Qt 拥有超过 25 年的历史,是一个非常成熟、稳定且功能强大的框架。它被广泛应用于各种类型的应用程序开发中,包括桌面软件、嵌入式系统、游戏引擎、医疗设备等。
现代 C++: Qt 充分利用了现代 C++ 的特性,并引入了自己的元对象系统(MetaObject System),包括信号与槽(Signals & Slots)机制,这是一种非常优雅的事件处理和对象通信方式,比 MFC 的消息映射更灵活、更易于理解。
丰富的功能模块: Qt 不仅仅是一个 UI 框架,它还提供了一整套模块,涵盖了:
Qt Core: 核心非 GUI 功能,如内存管理、线程、网络、文件操作、字符串处理等。
Qt GUI: 基础图形用户界面类,如窗口、控件、布局管理、绘图等。
Qt Widgets: 提供了丰富的、可定制的桌面控件集,可以轻松构建专业的桌面应用界面。
Qt Quick (QML): 允许使用声明式语言 QML 和 JavaScript 来创建现代化、动画丰富、触摸友好的用户界面,特别适合需要美观和动态交互的场景。
Qt Network: 用于网络编程,支持 HTTP, TCP/IP, UDP, SSL 等。
Qt SQL: 数据库访问。
Qt Multimedia: 音频和视频处理。
Qt Concurrent: 并发编程。
Qt Serialization: 数据序列化。
Qt Test: 单元测试。
强大的开发工具: Qt Creator 是一个集成开发环境(IDE),专门为 Qt 开发而设计,集成了代码编辑器、可视化界面设计器 (Qt Designer for Widgets, Qt Quick Designer for QML)、调试器、构建系统等,极大地提高了开发效率。
活跃的社区和丰富的资源: Qt 拥有庞大且活跃的全球社区,有大量的文档、教程、论坛和第三方库,你可以很容易地找到问题的解决方案和学习资源。
商业和开源许可: Qt 提供双重许可,你可以选择商业许可来开发闭源项目,也可以选择 LGPL 或 GPL 开源许可来开发开源项目。

学习路径建议:
1. 扎实的 C++ 基础: 在开始学习 Qt 之前,确保你对 C++ 的基本语法、面向对象编程、STL(Standard Template Library)有扎实的掌握。
2. Qt Creator 安装与使用: 下载并安装 Qt Creator,熟悉其基本操作。
3. Qt Core 模块: 从理解 Qt 的核心概念开始,如信号与槽、属性系统、对象模型、事件处理、容器类等。
4. Qt Widgets 模块: 学习如何使用 Qt Designer 设计 UI,然后通过 C++ 代码连接 UI 和逻辑。掌握各种常用控件(QPushButton, QLineEdit, QLabel, QComboBox, QTableView 等)及其属性和事件。学习布局管理器(QVBoxLayout, QHBoxLayout, QGridLayout)来组织控件。
5. Qt Quick (QML): 如果你需要开发现代化、动态感强的 UI,学习 QML 是一个很好的选择。了解 QML 的语法、属性绑定、状态管理、动画以及如何与 C++ 集成。
6. 常用模块学习: 根据你的项目需求,可以进一步学习 Qt Network, Qt SQL, Qt Multimedia 等模块。
7. 项目实践: 通过开发一些小型项目来巩固学习,例如一个简单的文本编辑器、一个文件管理器、一个网络聊天工具等。

其他选择(根据特定需求):

wxWidgets: 另一个跨平台 UI 库,使用原生控件,对于追求原生外观的应用可能更合适。它也是一个成熟的框架,但社区和工具链相比 Qt 可能稍弱一些。
ImGui (Immediate Mode GUI): 如果你主要是在游戏开发、工具开发、调试界面等场景下需要一个轻量级、快速迭代的 GUI,ImGui 是一个非常好的选择。它不提供传统意义上的控件,而是通过每次绘制时都重建 UI 来实现,非常灵活且性能极佳。但它通常不适合构建复杂的、标准的桌面应用程序。
GTK+ (GIMP Toolkit): 一个成熟的跨平台 UI 工具包,在 Linux 社区非常流行,也支持 Windows 和 macOS。它更偏向于原生 GTK 外观的应用。

2. 如果你的目标是:游戏开发

游戏开发是 C++ 的一个重要领域,但通常不使用 MFC。

游戏引擎:
Unreal Engine (C++): 功能强大,适合开发 AAA 级游戏。学习曲线陡峭,但提供了极其丰富的工具和功能。你需要学习其 C++ API 和蓝图(Blueprint)可视化脚本系统。
Unity (C): 虽然不是 C++ 主导,但 Unity 可以通过 C++ 插件集成原生代码(例如通过 IL2CPP),并且很多游戏开发者会选择 Unity。如果你想深入 C++ 在游戏引擎中的应用,可以先理解 Unity 的概念,然后探索其 C++ 集成部分。
Godot Engine (GDScript/C++/C): 一个开源且越来越受欢迎的游戏引擎,支持 GDScript(一种类似 Python 的脚本语言)、C++ 和 C。其 C++ 支持允许你编写高性能的游戏逻辑和模块。
游戏开发库:
SDL (Simple DirectMedia Layer): 一个跨平台的多媒体开发库,提供了访问音频、键盘、鼠标、操纵杆和图形硬件的底层接口。它常用于开发 2D 游戏或作为其他更高级引擎的底层基础。
SFML (Simple and Fast Multimedia Library): 类似于 SDL,但提供了更面向对象的 C++ API,易于使用,也适合 2D 游戏开发。
Allegro: 另一个老牌的 2D 游戏开发库。
图形 API:
Vulkan: 最新的、高性能的跨平台图形 API,用于开发要求极致性能的图形应用和游戏。学习 Vulkan 需要深入理解 GPU 工作原理。
DirectX (Direct3D): 微软的图形 API,主要用于 Windows 平台的游戏开发。
OpenGL: 一个老牌的、广泛支持的跨平台图形 API。
物理引擎: Bullet Physics, PhysX 等。
数学库: GLM (OpenGL Mathematics) 是一个非常流行的 C++ 数学库,用于图形编程中的向量、矩阵运算。

3. 如果你的目标是:系统级编程、嵌入式开发、高性能计算、底层库开发

这方面 C++ 本身就是王者,但通常不涉及 GUI 框架。

标准 C++: 深入理解 C++ 标准库(STL),包括容器(vector, list, map, set)、算法、迭代器、智能指针、并发库等。
并发与多线程: `std::thread`, `std::mutex`, `std::condition_variable`, `std::atomic` 等。
内存管理: 智能指针 (`std::unique_ptr`, `std::shared_ptr`, `std::weak_ptr`), RAII(Resource Acquisition Is Initialization)。
操作系统 API: 如果你需要直接与操作系统交互,可能需要学习 POSIX API (Linux/macOS) 或 Windows API (Windows)。但通常会通过更高级别的抽象库来完成。
嵌入式开发:
特定嵌入式平台的工具链和 SDK: 如 ARM CortexM 系列的 STM32CubeIDE, Keil MDK;ESP32 的 ESPIDF 等。
RTOS (RealTime Operating System): FreeRTOS, Zephyr OS, RTThread 等。
通信协议: I2C, SPI, UART, CAN, Ethernet, WiFi, Bluetooth。
高性能计算/科学计算:
数学库: BLAS, LAPACK, Eigen, Armadillo 等。
并行计算框架: OpenMP, MPI (Message Passing Interface), CUDA (for NVIDIA GPUs)。

4. 如果你的目标是:Web 后端开发 (使用 C++ 也可以)

虽然 Python, Node.js, Go 等语言在 Web 后端领域更常见,但 C++ 也能胜任,尤其是在需要极致性能的场景。

Web 框架:
Boost.Beast: 基于 Boost.Asio 的高性能 HTTP 和 WebSocket 库。
Cpprestsdk: 微软提供的跨平台 C++ REST SDK。
Pistache: 一个现代化的 C++ RESTful 框架。
Crow: 一个微型的 Web 框架,灵感来自 Python 的 Flask。
Drogon: 一个高性能的 C++ Web 应用框架。
网络编程: Boost.Asio, libevent, libuv。
数据库连接: 各种数据库的 C++ 驱动程序。



总结与给新入门者的建议:

1. 明确你的目标: 这是最重要的一步。你想用 C++ 做什么?桌面应用?游戏?底层系统?嵌入式?不同的目标决定了你的学习路径。
2. 打好 C++ 基础: 无论你的目标是什么,良好的 C++ 基础都是必不可少的。
语法和概念: 变量、数据类型、控制流、函数、类、继承、多态、模板。
内存管理: 理解栈、堆、指针、引用、生命周期。
STL: 熟悉容器、算法、迭代器、智能指针。
现代 C++ 特性: C++11/14/17/20 的新特性,如 `auto`, 范围 for 循环, lambda 表达式, 右值引用, 移动语义, 协程等。这些会让你写出更简洁、更高效的代码。
3. 如果你想做现代桌面应用,强烈推荐学习 Qt: 它提供了跨平台能力、丰富的模块、强大的开发工具和活跃的社区,是替代 MFC 的绝佳选择。从 Qt Creator 和 Qt Widgets 开始,然后可以探索 Qt Quick。
4. 如果对游戏开发感兴趣: 学习 C++ 基础后,直接选择一个游戏引擎(如 Unreal Engine 的 C++ API 或 Godot 的 C++ 支持)会是更有效的路径。同时可以学习 SDL/SFML 来理解底层原理。
5. 不要“只”学一个框架: C++ 的强大之处在于其通用性。学习框架是为了更好地实现你的目标,但底层知识和标准库的掌握才是核心竞争力。
6. 多实践,多写代码: 理论学习很重要,但只有通过不断地编写代码、解决问题,你才能真正掌握一门技术。从小的项目开始,逐步挑战更复杂的任务。
7. 利用好在线资源: C++ 和 Qt 都有大量的在线文档、教程、论坛(如 Stack Overflow)、视频课程。充分利用这些资源来辅助学习。

总而言之,对于新入门 C++ 的开发者,如果你的目标是开发现代化的桌面应用程序,那么学习 Qt 是一个非常明智且高效的选择,它能让你快速上手,并为你打开通往更广阔的 C++ 开发世界的大门。

网友意见

user avatar

学QT,你看很多有名公司的客户端都是用QT开发出来的,像wps,海康的视频客户端。

像腾讯,迅雷,360他们用的界面库是定制的,用的是DirectUI技术,但这样的界面不跨平台,如你想把客户端推向mac系统,ubuntu系统,就需要重新设计框架,这会非常麻烦而且成本很高,所以你只看到有名的软件有win/mac/ubuntu软件三个系统都有客户端,很多软件公司没有这么多精力,也没有能力搞3个平台的开发。其实你只要在选择软件开发平台时多考虑一下这个问题,实际上是可以解决的,可以做到多平台复用软件。

现在界面都向浏览器发展了,像微软的vscode就是代表,但这样界面现在只是在发展,而且不成熟,他们用的是实际上是把界面写在浏览器中,我也看到有的公司界面简单的是这么设计的,也有用qt的浏览器,然后外挂c++的调用。这样设计界面的好处是可定制性高,浏览器中本身是html5这类,有了基础框架后设计起来比较方便,但在原生性没有qt的跨平台界面好,适合一些互联网软件产品。

国外很流行开发跨平台软件,像Autodesk的动画制作软件Maya是用Qt开发的,用python做脚本引擎,VirtualBox开源虚拟机,也是用Qt开发的,用python做脚本引擎,这种软件不适合浏览器,都选择了QT做界面,在各个平台上有广泛的用户。而开发复杂软件时可以参考这种大型跨平台软件框架。像谷歌的chrome是定制的界面引擎,很多跨平台软件包装的就是chorme的开源引擎Chromium,然后做了一下各个平台的底层适配,使用js,html,css来开发界面,浏览器中的firefox也是定制的软件界面,他们不但定制了界面,而且定制了开发语言,rust就是这种。但这种定制开发,成本很高,不适合用户少的通用软件开发。

正常的客户端界面设计建议用qt,你可以分层设计,你可以用c++把界面和逻辑分离,逻辑层可以使用公用库可以使用boost这种有名的,可以方便编译到各种平台,在物理上分层,然后像ios/android上需要软件时,可以使用ios/android来调用这样的c++库。这样你开发的软件,可以多平台复用,降低了开发成本。

实际上QT也是支持跨平台开发的,好像对很多平台支持不是很完整,另外一种思想是做成浏览器版的,你的底层逻辑调用,调用各处平台,在上层使用HTML5,JS这些,换个平台时,你只要做一下底层适配,但html5,js在系统操作上表现有限,适合一些复杂性要求低的软件。

user avatar

用过很多 GUI framework(或 library),在我看来,不同时期不同 frameworks 的侧重点都是不同的。

MFC 那个时期,C++ 连 lambda 都没有,人们基本就是把它当作 C with classes 来用的,而 MFC 要解决的一大问题就是把 Win32 API 面向对象化,仅此而已。可以回想一下用 Win32 API 创建一个按钮大致是怎样的一个流程。那时候一切皆是窗体(Win32 API 中用 HWND 表示,注意,它还是 kernel-awareness 的),控件作为子窗体存在于父窗体中,多创建几个按钮说不定还会句柄溢出,直接影响系统其他应用。不仅控件是窗体,连 Timer、Socket 和一部分 IPC 都要依赖与 HWND + 消息机制来搞。所以说 MFC 就是 Win32 API 的 C++ wrapper 也不为过,甚至 MFC 本身都没有完全隐藏 HWND 这个概念。

之后微软搞过很多界面库,什么 WTL、WinForms,思路都差不多,并没有突破性的进步。

Qt 是一个老牌的 GUI framework,其实发展到今天,它已经是一个类似 boost 的 C++ 开发全家桶了。Qt 一开始也是控件即窗体,那是因为它最初尊重每个系统自己的 convention,也会尽量让开发者的一份代码,在不同的系统上都有非常 native 的表现。但是从 4.x 开始,Qt 引入了 Direct UI 的概念。这就非常超前了,要知道,很多 UI 效果是标准控件所达不到的,假设我能从系统那里要来一个“画布”,哪怕是 HDC,开发者可以发挥的余地都会很大。所以 Qt 那时候搞了个 Graphics Scene,支持一个屏幕下显示上万个元素,并且支持各种 transform、opacity、composition 特性。之后 Qt 又做了许许多多非常 handy 的特性,比如 QSS、动画框架等等。

Linux 家族还有一个老牌界面库,Gtk。这个库我简单用过一点点,没有很深入研究,但我实在不明白我为什么要在当今这个时间点自虐一样地使用 C + GObject 来写东西。但是不得不承认,GObject 和 Gtk 设计得都非常优秀,虽说是 C 写的,但从设计和功能性上来说,比用 C++ 的 MFC 高到不知哪里去了。况且现在 Gnome 还搞了一个 Vala 语言,写起来跟 C# 差不多。

后来我去做移动开发了,接触了 Cocoa 和 Android UI Toolkits,不得不承认,这两者设计得都十分优秀。他们最大的一个突破在于把渲染 layer 化。最早 Cocoa 还没有引入这个概念,然后 WWDC 2006 上,乔布斯向开发者介绍了 Core Animation,正式把这个概念带入 Cocoa 开发中。它的突破点在于,开发者在做 UI 渲染时不需使用类似 DC 一样地东西来“画”界面,而是告诉框架“我的界面有什么”。Android 的 Canvas 虽然类似命令式绘图,但底层也是会转换成 layer,然后交给 Skia 去渲染。有了 layer 这个概念,开发者基本无需考虑性能和跨平台的问题,因为框架会操心如何渲染开发者交给它们的 layer,部分框架也会做优化,比如裁剪掉不需要的 draw call 等。并且也可以很轻松地在软件渲染和 GPU 渲染之间 switch。这个新的抽象极大地方便了开发者的开发。后来 Qt 也引入了类似的技术,做出了 Qt Quick,具体我就不展开了。

有人提到 WPF,它在微软的各种 UI 框架中算非常优秀的了,到后期 UWP 也沿用了一部分其中的技术,如 Xaml。上文提到的 Direct UI 和硬件加速 WPF 都做到了,并且还带来一些新的有突破的特性,像双向绑定、模板、资源字典、高 DPI 支持等等。

到这里归纳一下,MFC、Qt、Cocoa 这三个库可以代表那个时间段所产生的技术:面向对象、Direct UI、Layer & GPU 加速渲染。

但是近些年,UI frameworks 的发展方向变了,大家不再去研究怎么把 Direct UI 做得更好,怎么把硬件加速玩出更多花。来看看 SwiftUI、Flutter,它们都是站在“巨人的肩膀上”,一个基于 UIKit / AppKit,另一个基于 Skia。它们用现有成熟的技术,搭配新的开发范式,来进一步提升开发效率改变开发方式。同样的还有 React、Vue,虽然它们也是 UI library / framework,但它们并不具体关心怎么“画” UI,反正真正的排版绘制交给浏览器就行了。


所以我想说的是,今天我们不需要纠结用哪个界面库了,界面库一直在发展,只是每个时期的方向和重点都不一样。老的项目考虑兼容性肯定需要采用不那么激进的方案,而新的项目现在用纯 native 的方式开发的人确实很少了。VS Code 已经证明,Web 技术也能做出一个高可用的 IDE 应用。现在不是还流行小程序吗?用一套 DSL 来描述界面,具体的 UI 渲染是用 Web 还是 native 开发者都不需要 care 了。这种做法也已经被广泛应用了,像 VS Code 有它自己的 UI 抽象层,Chromium 也有自己的 UI 抽象层。有了这些,开发者就只要专注于业务即可。语言?框架?那都不是事。

P.S. 看到很多回答都建议题主用 Qt,我觉得还是具体问题具体分析吧。用什么首先看场景,你说你要做一个 Photoshop、Word 这种级别的 app,Web 技术确实还比较捉襟见肘,首先性能就不会太好。但如果你要做一个音乐播放器、聊天软件,甚至游戏客户端,用 Electron + ffi 足够了,至少我日常使用的国产软件,我觉得 Electron 全都能搞定,再不行就 CEF(比如我现在部门做的产品)。

user avatar

MFC是否过时,需要从几个方面讲。1.设计是否过时 2.业务是否过时

MFC是微软给出的 windows c++应用框架,对win32 api封装,并提供了一套自动化工具visual studio,兼容原生的win32 c api,它几乎必须配合vistual studio来开发,还支持比较抽象的概念比如com等。

这就是MFC的使用场景了。

现在大部分公司如果做windows新应用,大概率不会再直接使用mfc,而是使用微软给出的 c# wpf 这套方案。

如果公司技术仍然是mfc,要么是维护老的平台代码;要么是公司的技术路线就是c++,大量的扩展功能都是c++开发;

综上,MFC的业务我认为是过时的。大环境不是MFC过时,现在是互联网的天下了,做原生前端软件本身就很过时,开发难度大,工作机会少,还不挣钱。现在网上看看,讨论最热烈的,都是web前端、后端,动不动就高并发、分布式,人工智能AI、区块链等,技术更新太快了,MFC都几十年了,不会太调整了,这些新兴领域,才是未来,前景一篇大好。

设计是否过时呢?我们对比最多的就是MFC和QT,因为毕竟这俩都是C++写的。那么可以说,肉眼可见的设计落后。但是,要理解,MFC是没办法的,它的目的:1.完美兼容 windows c api 2.性能跟原生开发一个量级 ,你看看吧,这样的需求,当时的C++语言功能如此孱弱,为了不影响性能,大量使用宏,为了兼容,消息传递就是原生的msg,只能设计成这样了。这是无奈之举,你看后来用C#弄了一套,是不是顺眼多了。 QT跟MFC相比,无论是原生接口的融合度,还是性能,都是有差距的。 但是,QT目的不在于此,它就是要设计,模拟出一套跟平台无关的应用接口,它告诉大家,不管什么平台,做应用,应该有哪些接口。

新人入门,要看你入什么门了。是C++,还是win32开发呢?

如果是c++应用开发,不建议做MFC了。因为大环境上,做这个太委屈了。出力不讨好,别难为自己了。可以选择做做Linux端的c++服务应用,搞搞数据库等,这些内容更新慢,不容易过时,跟c++的定位相似

如果是做win32原生开发,那我建议从c#入手。

一切都是有感而发,未必正确,仅供参考。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有