C++ Windows客户端开发学习路线(超级详细)

和 Mac OS、Linux 操作系统相比,Windows 系统的市场占用率一直遥遥领先,远高于其它操作系统。

Windows 客户端开发又称 Windows 桌面程序开发或者 Windows GUI 开发,指的是开发和维护在 Windows 系统上运行的应用程序,例如 Microsoft Office、Adobe PhotoShop、QQ、迅雷、微信等。

很多小伙伴都对 Windows GUI 开发感兴趣,期望做出一款炫酷拉风的软件,但是又不知道具体的学习路线,比如:

  • 需要掌握哪些技能,每种技能都需要掌握到什么程度?
  • 先学什么,再学什么,具体学习顺序是怎样的?
  • 哪些技能可以暂时跳过,哪些技能可以浅尝辄止,哪些技能必须深入学习?
  • 自己玩该怎么学习,找工作该怎么学习?

如果你也有这些困惑,请一定要耐心读完这篇文章,我将帮你梳理出一个完整的 Windows GUI 开发学习路线。

和互联网上其他博主分享的学习路线相比,这套学习路线不仅更加完整和详细,而且还会帮你做出选择和取舍,让你尽快学有所成,找到成就感和满足感。

注意,拥有选择权是一件非常重要的事情!

Windows GUI 开发涉及到的技能板块非常繁杂,短期内不可能全部都掌握,为了加快学习进度,尽早开发出一款实用的软件,我们需要暂时先舍弃一些技能,或者对一些技能浅尝辄止,等到以后有余力了再回来学习。

这套学习路线就肩负了这个使命,它将告诉你各种技能在不同场景下的重要程度,让你知道如何选择,避免折腾和踩坑。

Windows GUI 开发前景

学习 Windows GUI 编程之前,你肯定也想了解一下它的发展前景,但是这里不得不泼一盆冷水,当下 Windows GUI 开发算是一个比较冷门的方向。

虽然 Windows 系统的用户基数很大,但是随着云计算和浏览器的不断发展,很多常见功能都可以通过网站来提供了。网站的一个巨大优势是可以跨平台,只需一次开发,就能够在不同操作系统、不同硬件设备上使用,节省了大量的时间和成本。

客户端程序已经不再是各个互联网公司率先考虑的平台,只有那些运算量大、数据量大的软件,才会考虑开发客户端程序。

因此从整体上看,现阶段 Windows 客户端开发的岗位需求并不大,很多岗位都是负责现有客户端程序的维护和更新工作,只有少数的一些公司有开发全新 Windows 客户端软件的需求。

Windows GUI 主流技术

虽然这篇文章我主要梳理 C/C++ 开发 Windows GUI 程序的学习路线,但你也需要知道,很多编程语言都可以开发 Windows GUI 程序,包括 C/C++、C#、JavaScript、Java、Python、易语言等。

目前主流的 Windows GUI 开发方案有三种,分别是:

  • 使用 C/C++ 语言开发,需要用到 Qt、MFC、WTL 等框架;
  • 使用 C#(CSharp)开发,需要用到 Winform 和 WPF 框架;
  • 基于 Chromium 和 Node.js 的 Electron,让你可以使用 HTML、CSS 和 JavaScript 开发 Windows GUI 程序,微软发布的 Visual Studio Code 就是用此技术开发的。

这些方案各有优缺点,例如:

  • C/C++ 程序的运行效率高,但开发效率不如 C# 和 Electron;
  • Electron 具有很好的跨平台特性,但编写的软件安装包通常比较大,程序第一次启动时较慢。

开发不同的 Windows 客户端产品,公司会基于成本、开发效率等因素综合考虑选用最合适的开发方案。

Windows GUI 学习路线

1. C/C++

既然用 C/C++ 开发 Windows GUI 程序,首先要掌握的必然是C语言和 C++。

事实上,只学习C语言也能进行 Windows GUI 开发,也能做出类似 QQ、迅雷等待界面的程序,但C语言开发效率低,第三方库较少,实际项目中没有程序员会这样做,大家都转向了 C++。

我强烈建议先学习C语言,然后再学习 C++。这里给大家推荐一套适合新手小白阅读的 C 语言教程,教程通俗易懂、知识点全面,适合想快速入门 C 语言的小伙伴:

C语言入门教程(非常详细)C语言是一门面向过程的编译型语言,运行速度极快,仅次于汇编语言。C语言是计算机产业的核心语言,操作系统、硬件驱动、关键组件、数据库等都离不开C语言;不学习C语言,就不能了解计算机底层。icon-default.png?t=N7T8https://xiexuewu.github.io/c/

C语言和 C++

C++ 和C语言虽然是两种编程语言,但它们的关系非常密切。您可以这样理解,C++ 是在C语言的基础上发展来的,C++ 在C语言的基础上增加了很多新的特性,玩出了新花样,大大提高了开发效率。因此学习了C语言也就学习了 C++ 的一半,从C语言转向 C++ 时,不需要再从头开始,接着C语言往下学就可以。

如果你没有任何编程基础,我建议先从C语言学起,等熟悉了C语言,能编写上百行的代码了,这个时候再去了解 C++ 究竟在 C语言基础上增加了什么,你就站在了一定的高度。

有人可能会问,能不能跳过C语言直接学习 C++ 呢?原则上是可以的,但是初学者直接学习 C++ 会比较吃力,尤其在对计算机底层知识不太理解的情况下,C++ 是很难学懂的,所以不建议你直接学习 C++。

另外,就算你直接学习 C++,也要先学习C语言部分,然后才能学习 C++ 的新增特性。

注意

编程语言是一种工具,是为项目服务的,我们应该尽快着手开发自己想要的软件,而不是陷在编程语言的泥潭里拔不出来,纠缠于各种语法细节。

初学者花费两个月左右的时间就能掌握 C/C++ 常用语法,并初步建立起编程思维,做出类似学生信息管理系统这样的“小玩意”,此时你的 C/C++ 水平就足够支撑后续的学习了。

当然,如果你想找一份 GUI 开发工作,尤其是进大厂,C/C++ 一定要玩得非常溜。这个可以在后续的实际项目开发中逐步深入,并在找工作之前进行一下突击。

只有亲自做过项目,才能知道哪里是重点,才能有的放矢,才能节省学习时间;如果一开始就陷进编程语言的沼泽中,捣鼓那些万年不用的“语法糖”,那么只会让自己越学越吐血,逐渐消磨掉兴趣和热情。

2. 数据结构和算法

数据结构和算法本质上是两门课程,但是它们之间又相互依赖,有时候很难分得一清二楚,所以很多教材喜欢将它们掺杂到一起,讲解数据结构的时候也会涉及一些常见算法。

数据结构研究数据的存储和读取方式,算法研究解决问题的方法和步骤;在不同的开发场景中,需要采用不同的数据结构和算法。

数据结构和算法的选择会极大影响程序的运行效率和资源占用,一种高效的数据结构和算法的组合,有时候能让程序的综合性能提升一个数量级。

数据结构和算法设计极其考验一个程序员的逻辑思维能力和问题解决能力,一个强者往往胜过十个臭皮匠。那些在大厂搞算法的程序员,工资往往都比那些搞软件开发/应用开发的程序员高一截,年薪百万都司空见惯。

总起来说,数据结构和算法是一个程序员最硬核的能力之一。

在实际开发中,常见的数据结构和算法其实都已经被编程语言/库/框架封装好了,很多时候你不用自己手撸代码去实现,只需要调用一下 API(接口)就行。但是,调用 API 之前你需要知道它的优势和劣势,明确它能够胜任的具体场景,此时就需要你了解数据结构和算法的底层原理。

也就是说,学习数据结构和算法的目的并不一定是手写代码,而是知道如何使用现有的 API,让自己掌握选择权。

需要学到什么程度?

如果你想找一份靠谱的工作,尤其是进大厂/独角兽,那么就要认真研究一下常用的数据结构和算法,并亲自手撸代码去实现一遍。

这里推荐一套非常 Nice 的数据结构和算法教程,教程以 C 语言作为开发语言,对各个知识点进行了图文并茂的讲解,还提供了完整、可运行的 C 语言程序,非常适合新手小白学习:

数据结构与算法教程,数据结构C语言版教程!icon-default.png?t=N7T8https://xiexuewu.github.io/ds/当然,为了尽快做出软件并找到成就感,你可以暂时先简单了解一下常用的数据结构和算法,然后就准备着手开发,等到找工作之前再回来恶补。想进大厂的小伙伴要辛苦一点啦,需要多刷一些算法题。

如果你只是想自己捣鼓一些 GUI 程序,那么只需要简单地了解一下常用的数据结构和算法,不用自己手撸代码去实现。

好吧,不得不承认,即使你不学习数据结构和算法,很多时候也不影响程序的使用。

3. 链接库

中大型程序往往都需要以模块化的方式进行开发,对于 C/C++ 而言,所谓的模块就是链接库,具体来说包括动态链接库和静态链接库。

Windows 下的动态链接库文件后缀是.dll,静态链接库文件后缀是.lib。Linux 下的动态链接库文件后缀是.so,静态链接库文件后缀是.a

动态链接库在程序运行阶段被加载,静态链接库在程序编译阶段被合并,它们各有优缺点,适用于不同的场景。

实际开发中我们会经常和各种库打交道,包括 C/C++ 标准库、系统库、第三方库和自己编写的库。不管你是找工作还是自己捣鼓软件,都需要学习链接库,即使你不自己开发链接库,也需要调用别人的链接库。

学习链接库,重点是掌握两种库的使用方法和制作方法,并搞清楚它们的优缺点和适用场景。

4. 并发编程

现阶段,计算机 CPU 频率的增长速率已经趋于平缓,正在往多核的方向发展。并发编程指的就是充分利用 CPU 多核的计算能力,让计算机同时执行多个任务,提高程序的整体性能。

并发编程的实现方式主要有两种,分别是多进程编程和多线程编程,两种方式各有优缺点。一般情况下,并发编程通常采用多线程编程来实现。

多进程/线程编程不仅是笔试面试的必考知识点,也是实际开发中常用的技术,每个程序员都必须熟练掌握,尤其是多线程编程。

并发编程的实现方式有多种,可以调用 Windows API,也可以调用 C/C++ 标准库或者第三方库。

如果你想找一份靠谱的工作,最好先从 Windows API 开始学习,然后再熟悉 C/C++ 标准库或者第三方库的使用方法。多线程是 Windows 系统内核提供的功能,学习 Windows API 能够从底层搞明白多线程的工作原理。

如果你只是想自己捣鼓一个软件,那就看着办吧,怎么方便怎么来,多线程的底层原理貌似没有那么重要。

5. 网络编程

网络编程有时候也称 Socket 编程,是一种联网计算机之间交换数据的技术。

如果你没有听说过 Socket 编程,那你肯定听说过 TCP/IP 协议,它们基本上是一个东西。

也就是说,学习网络编程就是学习计算机之间如何通信,并用编程语言来实现它。只有掌握了网络编程,才能开发出连接互联网的程序。

每个程序员都需要学习网络编程,并了解它的底层原理。对于用户数量众多的软件,网络通信至关重要,扛不住高并发可能会导致服务器宕机。

越是大型的互联网公司就越是重视网络编程,如果你想进大厂,我建议你一定要好好研究一下。

目前流行的网络库也有很多,但是大部分都是针对服务器端的,比如著名的 C++ 网络编程三剑客——Libevent、libev 和 Libuv,以及 Boost 库内置的 Asio 模块。

对于客户端程序来说,这些库有点过于庞大了,所以往往使用一些轻量级的库来替代,比如 libcurl、WebSocket++ 等。

另外,如果你的项目中使用的库/框架恰好包含了网络模块,那么也可以使用这些内置模块,比如 Boost 中的 Asio 模块、Qt 中的 Network 模块。

没有哪种网络库能够一统江湖,实际开发中需要根据具体场景做出正确的选择。

网络通信由 Windows 内置的 TCP/IP 协议栈提供支持,如果你想找一份靠谱的工作,我建议先从 Windows API 学起,把底层原理吃透,然后再学习一两个常见的网络库,或者某个库内置的网络模块。

如果你只是想自己开发一款软件玩玩,那就看着办吧,怎么方便就怎么来吧。

6. 设计模式

设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决某些特定问题的成熟套路。

设计模式一共有 23 种,可以简单地了解一下它们,做到心中有数。初学者不需要把它们全部搞懂,先学会常用的几个即可,包括单例模式、工厂模式、代理模式。

7. 数据库

数据存储方式通常有两种:

  • 如果数据量较小,可以存储到文件中;
  • 如果数据量较大,通常使用数据库来存储。

小型客户端软件在本地存储数据时一般使用文件足以,只有那些大型或者复杂的软件才会用到数据库。

服务器端存储数据需要使用大型数据库,比如 Oracle、MySQL、SQL Server、MongoDB 等;而客户端存储数据往往只需要一些小型的或者嵌入式的数据库,最常用的是 SQLite。

数据库编程是后端程序员必备的硬核技能,GUI 程序员一般不需要深入研究,只要能够熟练地对数据进行“增删改查”即可。

SQLite 是关系型数据库,需要先学习 SQL 语言,然后再通过 C/C++ 代码执行 SQL 语句来控制数据库。

8. Windows GUI 开发框架

虽然 Windows 系统本身也提供了 GUI 开发的接口(API),但是它非常晦涩和难用,简直让人吐血,所以实际开发中没人直接使用 Windows API,而是基于某个框架进行开发。

所谓框架,其实就是别人编写并封装好的一堆代码,这些代码往往具备很好的通用性,能够提高软件开发效率,避免重复造轮子。

当我们编写程序时,可以直接调用框架中的类和函数。

具备 C/C++ 基础之后,就可以开始学习 Windows GUI 框架了,比如:

  1. MFC:微软发布的一款 C++ 框架,专门用来开发 Windows 平台上的 GUI 程序。从某种程度上说,MFC 就是使用面向对象的方式对 Windows API 进行了封装,所以学习 MFC 之前必须对 Windows API 有所了解,否则是学不会 MFC 的。
  2. wxWidgets(简称 wx):一款开源、免费、跨平台的 GUI 库,还支持多线程编程、网络编程等。wx 和 MFC 很接近,有 MFC 基础很容易可以学会 wx 的用法。
  3. Qt:一款支持跨平台的 GUI 开发框架,和其它 GUI 库相比,Qt 可以制作更精美的界面,还支持多线程、网络通信、图像处理、数据库、多媒体等。
  4. DUILIB:一款轻量级的 Windows GUI 库,制作出的界面外观和 Qt 一样美观,代码结构简单、体积小。
  5. WTL:一款专门开发 Windows GUI 程序的 C++ 库,它的功能没有 MFC 完善(支持的控件比 MFC 少),但写起来比 MFC 更简单,开发效率更高。

这些 GUI 框架各有优缺点,没有哪一个能够独霸 Windows GUI 编程。学会任何一个框架,都可以开发 Windows GUI 程序。有些公司基于自身业务考虑,会要求掌握多种框架,或者开发自己的 GUI 框架。

对于初学者,我建议先学习 Qt,它不但容易上手,而且界面漂亮,还能跨平台。

9. 绘图技术

我们在屏幕上看到的各种元素,包括按钮、菜单、输入框、边框、阴影、工具栏等,本质上都是图像,在底层都是通过绘图函数画出来的。

这些绘图函数隐藏在了 Windows API 或者框架的背后,我们在进行 GUI 编程时往往不容易感受到,但实际上它们才是真正的幕后英雄。

常见的绘图技术/工具包有 GDI(增强版叫做 GDI+)、OpenGL 和 DirectX。

基于 2D 的 GUI 程序一般使用 GDI 和 GDI+ 就足够,只有在面向 3D、多媒体、游戏开发时往往才需要更加高级的 OpenGL 和 Direct X。

如果你只是想自己开发一个软件玩玩,那么基本不用了解这些背后的技术;如果你想进大厂,或者想成为大咖,那么就得关注一下这些技术了,你可以尝试自己用 GDI 绘制一个控件,并给它绑定事件。

对于客户端程序员来说,了解 2D 绘图技术即可;只有那些搞游戏开发或者多媒体渲染的程序员,才需要了解 3D 绘图技术。

10. 其它知识

以上罗列的这些知识,足以支撑你开发出一款靠谱的 Windows GUI 程序,找到一份满意的工作。

如果你还想继续提升自己的编程能力,在 Windows GUI 开发领域深耕,可以接着学习以下知识。

1) C# 及相关开发框架

实际开发中,有些 GUI 项目并不只是使用 C/C++,而是同时使用 C/C++ 和 C# 进行混合开发:用 C# 制作精美的界面,用 C/C++ 实现一些底层算法和逻辑。

使用 C# 开发 Windows GUI 界面,可以借助 WPF 和 WinFrom 两种框架实现,最好是两种框架都达到“会用”的程度。

2) COM、ATL

COM 是微软提出的一种软件开发技术,与面向过程、面向对象编程类似,COM 并不是一个大的 API,而是一种编程思想。

微软的很多技术都是基于 COM 建立起来的,比如 ActiveX、DirectX、OLE 等,微软的开发人员也大量使用 COM 组件来定制他们的应用程序。

ATL 是一套制作 COM 组件的开发工具(C++ 模板类库),它可以简化 COM 组件的开发流程,提高开发效率。

有些公司基于业务的需要,招聘要求中会注明要了解 ATL,学习 ATL 之前要先掌握 COM。

总结

以上学习路线可能比较混乱,为了让读者有一个更加直观的印象,我特地制作了一份简明扼要的汇总表格。

对于不同的学习场景,我也标注了各个知识板块的重要程序:

  • ☆☆ 表示可以跳过或者放弃,以后有需要的话再来学习;
  • ★☆ 表示需要进行了解,但是不需要深度学习;
  • ★★ 表示非常重要,需要深度学习。

表:Windows GUI 开发学习路线

序号

技术栈

说 明

找工作

自制软件

01

C/C++

建议先学习C语言,再学习 C++。

★★

★☆

02

数据结构和算法

可以不用,但不能不了解。

★★

☆☆

03

链接库

掌握静态链接库和动态链接库的制作方法和使用方法。

★☆

★☆

04

多线程编程

多线程是最常用的并发编程方式。

★★

★☆

05

网络编程

先学习 TCP/IP 协议栈,接着了解 Windows API,然后学习一两个常用的网络库,或者某个库内置的网络模块。

★★

★☆

06

设计模式

只需要重点了解几种常见的设计模式,比如单例模式、工厂模式和代理模式。

★☆

☆☆

07

数据库

推荐学习 SQLite,能够对数据进行“增删改查”即可。

★☆

☆☆

08

GUI 框架

常用的开发框架有 MFC、Qt、wxWidgets、WTL 等,初学者建议从 Qt 入手。

★☆

★☆

09

绘图技术

涉及 GDI、GDI+、DirectX 和 OpenGL 等。

★☆

☆☆

10

其它知识

包括 C#(WPF 和 WinFrom)、COM 组件技术、ATL 等。

☆☆

☆☆

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据结构和算法教程(C语言版)

创作不易,多多支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值