有一定基础的 C++ 学习者该如何学习 Windows 编程?

Posted analogous_love

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有一定基础的 C++ 学习者该如何学习 Windows 编程?相关的知识,希望对你有一定的参考价值。

这篇文章是回答一位知友的提问:

有一定基础是指对大学教材级别的C++知识有了解,然而只停留在黑框程序的编写和阅读上。
手头有一个使用VS2010开发的windows工程想要读懂(这是契机,不是原因),长久以来的困惑使得我希望找到一本适合初学者的书。图书馆里的书大多是陈旧的(VC++6.0)而且不涉及windows程序开发的教材,要么就是劈头盖脸各种不明就里的程序段。
我查阅过很多书籍,也从知乎上了解了许多类似C++ Primer/ the C++ programming language这样的书目,但是我真切地觉得它只适合已经深入的编程人员了解这门语言的各个方面,却不适合初学者快速弄清“基本问题”,把握脉络。
我知道C++的学习曲线很陡峭,并对学习的困难抱有觉悟,自己(大学生)也不是相关专业的,只是对计算机编程颇为热衷,一直在磕磕绊绊中自行探索学习道路。

我的回答:

我曾经和你一样困惑,直到我遇到了两本书,这两本也改变了我的人生轨迹。

一、我的工作经历

毕业以后,我非 Windows C/C++ 工作不做,最后达成所愿。先后做过股票交易系统的客户端,类似这种:

是不是看起来挺复杂的?掌握了原理,其实一点不复杂。

我为了帮助大家学习,写了一个简易的 demo,代码下载地址:

链接: https://pan.baidu.com/s/1huHh5cY1Ro1pe6cSXEXodQ 提取码: lka8 
 

通俗地说,Windows 有界面的程序的基本原理是:

步骤一:注册窗口类;

步骤二:利用窗口类创建窗口;

步骤三:进入消息循环队列,触发 Windows 消息处理各个消息。

后来我去二三四五继续做 Windows C/C++ 开发,参与的项目是二三四五的战略软件的开发。所谓战略软件是二三四五不以盈利为目的的几款口碑比较好的软件,如好压、看图王、王牌浏览器、二三四五输入法。如果你对这些软件背后的原理很感兴趣,可以看下金山卫士的源码或者紫光拼音输入法的源码,它们都开源了,我整理了一套可以直接编译、运行、调试的版本,分享一下:

金山卫士

源码获取:

链接: https://pan.baidu.com/s/16AAKv8_SA4qhBi1BPRu4kg 提取码: 3a9r 
 

紫光拼音输入法

紫光拼音输入法开源的确在我意料之外的。源码地址:

GitHub - balloonwj/unispim: 华宇拼音输入法核心源码(source code of unispim)

二、学习方法

就我个人而已,我接触 Windows 编程,已经十多个年头了,尤其是在我读研的三年内,基本心思都是花在学习和研究 Windows 程序上了,工作以后一直做到 PC 端开发负责人。

我很庆幸我当初学习 Windows 程序走了一条正确的路线:

先是学习常用的 Windows 程序原理和基本 API,再学习的 MFC、WTL 等一些常用的框架和类库,同时看了大量 Windows 项目的源码,如金山卫士的开源代码、Filezilla、电驴源码等等。

个人觉得,基础真的很重要,拿 Windows 开发来说,当你掌握了 Windows 程序的基本原理,我列一下大致范围:

1. Windows 消息机制(消息如何产生、如何发送、如何处理,常见的消息有哪些、消息的优先级、如何自定义消息、窗体消息、常用控件消息)

2. GDI 原理(要熟悉 GDI 的各种对象,如画笔、画刷、字体、区域、裁剪、位图等,熟悉它们的 API,熟悉各种 GDI 绘图 API、当然最好也要熟悉一整套的 GDI+ 的类,GDI 与 GDI+ 的区别)

3. Windows 进程与线程的概念(进程的概念、如何创建、如何结束、跨进程如何通信;线程的创建与销毁、线程间的同步与资源保护,熟悉 Windows 常用的线程同步对象:临界区、事件、互斥体、信号量等)

4. Windows 内存管理(清晰地掌握一个进程地址空间的内存分布、Windows 堆的创建与管理等)

5. DLL 技术(DLL 的生成、变量的导出、函数的导出、类的导出、如何查看 DLL 导出哪些函数、隐式 dll 的加载、显式的 DLL 的加载、远程 DLL 注入技术等)

6. PE 文件(一个 PE 文件的结构、有哪些节、如何修改、分别映射到进程地址空间的什么位置等)

7. Windows SEH(结构化异常处理)

8. Windows Socket 编程

9. Windows 读写文件技术(像 CreateFile、WriteFile、GetFileSize 等这些API应该熟练掌握、内存映射技术)

当然很多必备的技术也不好归类到 Windows 技术下面,比如 Socket 编程,这涉及到很多网络的知识,例如 TCP 的三次握手、数据的收发等,还有就是各种字符编码的知识以及之间的相互转换,又比如一系列的 CRT 函数及其对应的宽字符版本。

我在知乎上专门开了一个 live 介绍 Windows 开发必知必会的技术,有兴趣的可以戳这里:

画龙点睛——从 Windows 程序到商业产品​

当然如果你搞 Windows 开发,一定要熟悉开发工具 Visual Studio,熟悉其工程项目的大多数属性配置,而且要做到知其然也知其所以然。

如果不是不能跨平台,我敢说 Visual Studio 是史上最好最强大的开发工具,没有之一!

Windows 开发现在已经不是我的主业了,目前主要从事服务端开发,但 Windows 的很多设计思想真的很好,非常值得借鉴,而且从编码风格来说,虽然看起来有点怪异,但是非常规范和易懂。

有了基础知识,你可以轻松地对工作中的一些问题给出解决方案,也能轻松阅读和使用市面上的那些库,比如,如果你深刻理解 Windows GDI,你不会在一个群里大喊,duilib 某个属性为什么不起作用,你可以直接去阅读它的画法代码,如果是 bug 你可以改 bug,如果只是你使用错误,你可以了解到正确的使用方法。

所以基础这个东西,在短时间内,可能让你看不出与其他人的差别,但是从长远来看,它决定着你在技术之路上攀多高、走多远。套用侯捷先生的一句话:勿在浮沙筑高台。

三、推荐的书籍

如果你对 Windows C/C++ 编程感兴趣,我推荐两本书:

1.《Windows 程序设计》

这本书讲述了 Windows UI 相关原理的方方面面,且语言朴实、娓娓道来,犹如一位良师益友,我当初也是看这本书进入 Windows C/C++ 开发领域的;这本书的业界地位很高,可以说这本书是中国的老一代 Windows 程序员的启蒙和进阶读物。

获取链接:

链接: https://pan.baidu.com/s/1JOee7ZkhnMiH7jIzVYioYw 提取码: pdmv 
 

2. 《Windows 核心编程》

这本书正好与上一本相互弥补,讲述的是 Windows 非 UI 部分的运行原理,内容非常丰富,当之“核心”二字无愧,图书的作者是编写 Windows Sysinternals 套件的 Jeffrey Richter,如果你没听说过 Windows Sysinternals 套件,那你一定听说过,Process Explorer:

侯捷老师评价这本书是“搞 Windows 开发,需要两样资源,一是 MSDN,一本就是《Windows 核心编程》”,这本书口碑非常好,多次重印,每一版都有一些新的改动和惊喜。

获取链接:

链接: https://pan.baidu.com/s/1OBsZQI2A5QT5ycuHxgwsLw​​​​​​​ 提取码: gegl 
 

最后,祝你达成所愿!

以上是关于有一定基础的 C++ 学习者该如何学习 Windows 编程?的主要内容,如果未能解决你的问题,请参考以下文章

Java基础念整理(jdkjar)

转行零基础该如何学Python?

转行零基础该如何学Python?这些一定要明白!

如何突破C++学习瓶颈期?

Node.js学习如何提高自己?我想自学

如何系统地学习 C/C++ 语言从零基础学习C++,有哪些书籍可以帮助到你?