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

人的心理有个奇妙的特性:一项知识一旦学会之后,学习过程中面临的困惑和不解很快就会忘得干干净净,似乎一切都是自然而然,本来就该这样的。因此,关于「如何入门」这类问题,找顶尖高手来回答,未必能比一个刚入门不久的人来回答要好。就譬如最高票的那个回答,是一个非常精通
Windows 编程的高人回答的,但这样的答案能给初学者带来多少帮助,我这里想先打一个问号。

前段时间刚辅导了一个学生学会了 Win32 GUI 编程,刚好看到这个问题,顺手就邀请他回答了。并非是给他布置总结作业,仅仅是希望能从他这里得到第一手的经验和个人体会,能给尚未入门的朋友带来更多帮助。可惜的是,读了他的回答之后,我感觉他的总结相当不到位。一份好的总结,应该能做到让一个尚未入门的人读过之后,能够原样复制他的学习过程,学到和他目前一样的程度。很可惜这份总结里强调的全都是一些细支末节的东西,而最关键的核心问题却一个都没有提到。我只能站在我的角度把这个问题再总结一遍,希望这位学生在看过我的总结之后,能重新修改一下他的答案,让它能够真正对初学者有用起来。另外,这类问题的答案我希望他不要使用匿名身份,这也算是一个对自己的言论表示负责的态度吧。

接下来我就大致总结一下我是如何辅导这个学生学会 Win32 GUI 编程的:

———— 正文————

本文只涉及 Win32 GUI 入门,不涉及其它 Windows 编程的话题,譬如网络操作、异步 IO、系统服务、线程同步什么的,不要因为我没有提到那些内容就跳出来说我「答非所问」,我相信题主想要问的也不会是那些话题。

要想学习 Windows 编程,首先最重要的一点是:C 语言必须入门。这个要求听上去像是废话,可是事实上目前国内大部分计算机专业的学生本科甚至硕士毕业都没能达到,因此我不得不单独提出来再次强调一遍。C 语言入门之后再学 Windows 编程,可以避免很多不必要的挫折,节约很多时间。固然,有很多人在
C 语言没有入门的情况下就开始了 Windows 编程的学习,到处碰壁撞得头破血流之后仍然学会了 Windows 编程,而且顺便把 C 语言也入门了的,譬如我,但我并不认为这样的经历是值得向所有人推崇的。我个人认为,先停留在黑框框下把 C 语言入门了再开始学习 Windows 编程,是性价比更高的做法。

至于 C++ 的学习,C++
和 Windows 编程是两棵不相关的技能树,学习 C++ 并不要求你必须懂得 Windows 编程,写 Windows 程序也并非必须用 C++。熟悉 C++ 对于学习 Windows 编程或许有间接的帮助,但至少直接的联系是没有的,你完全可以在没学过 C++ 的情况下就开始学习 Windows 编程。

要入门 Windows 编程,最重要的不是阅读什么教材,使用什么工具,而是先必须把以下几个对于初学者来说非常容易困惑的重要概念搞清楚:

1. 文字的编码和字符集。这部分需要掌握 ANSI 模式和 Unicode 模式的区别(并且明白这里 ANSI 和 Unicode 事实上都属于术语的误用);明白这两种模式其实是通过宏实现的一个 dirty-hack(有相当数量的人在实际工作中因为这个宏的原因被咬过);知道如何通过
TCHAR、_T()、条件编译等方式写出 Unicode 兼容的代码(即使你将来写的所有 Windows 程序的源码都将是 pure Unicode 的,不再会支持 ANSI 模式编译)。

2. 熟悉常见 Win32 类型名称(譬如 LRESULT、WPARAM、UINT、LPCTSTR
等都是什么意思),知道什么是函数调用规范(譬如 __stdcall、__cdecl 等,以及常见别名譬如 WINAPI、PASCAL 等。不要求记住这些调用规范在汇编层面都是怎么实现的,只需要知道它们是不同的,大概了解为什么不同,为什么不能混用)。

3. 了解句柄的大概原理和资源管理。这部分要求比较简单,一个 C 语言真正入门的学生,在之前的学习里应该早就已经涉及过动态内存分配和管理了,也在一些练习里自己实现过类似句柄的面向对象封装方式了,因此学到这里的时候只要把句柄和他之前学过的内容联系起来,这部分并不难学。但如果你遇到动态内存分配的时候还是搞得一塌糊涂,对于对象所有权转移、生命周期管理等还一头雾水,我个人建议你先回到「黑框框」把
C 语言入门了再来学 Windows 编程。

4. 理解消息模型。当一个程序调用 GetMessage 之后,在收到消息之前你的程序是不在运行的,相当于是死在那儿的,这对于之前从来没有接触过 Win32 GUI 编程的人来说这个概念相当反直觉,需要举足够的例子来帮助他理解为什么一个「收不到消息就死在那里完全不运行」的记事本能做到用鼠标一点菜单就能弹出来,没人动它的时候它的光标仍然随时都在一闪一闪等等。思维转过弯来,理解了这个概念之后,对于为什么不能在窗体过程里做费时的操作,UI
线程和工作线程都有什么用,以及什么时候需要启动工作线程等问题,也就自然而然就能想明白了。

5. 理解窗体重绘机制。这点其实属于消息模型的一个子话题,但由于入门的时候会给初学者带来的困扰很大,因此我单独提出来作为一个点。在 Windows 9x 下,一个窗口出现在另外一个窗口上方的时候,是会把下面的窗口上的内容抹去的。当上面的窗口离开之后,下面的窗口需要重画自己被抹去的内容。更高版本的
Windows 虽然系统能够自动缓存被遮盖的窗体上的内容,但从编程的角度来看,程序员仍然需要遵从之前的窗口绘制机制来编写自己的程序,假定自己的程序被覆盖的时候会被擦除。为了能够正确处理擦除与重绘,绘制窗口内容必须通过监听重绘消息来进行,想改变窗口内容的时候不能随时往窗口上画,而是要先准备好要画的内容但不画,然后发消息触发重绘消息让系统通知你画。这些反直觉的行为的理解和掌握,是初学的时候必须迈过的坎。

上面这些概念都掌握之后,入门 Win32 GUI 编程就是一件相对容易的事情了。接下来只要找一份入门教程,按部就班把例题都过一遍,再自己亲手写几个 GUI 小程序,差不多也就上手了。这位学生在总结的时候提到说我推荐了一份非常有名的教程,很抱歉让他失望了,那份教程其实我自己都没看过,我只是在网上随手搜了一个教程,看了一下目录,发现他入门需要的知识点上面都有列举,于是就发给他了。总之,入门
Windows 编程,最重要的是理解并掌握上面提到的几个基本概念,概念掌握了,任何一份不要存在严重错误和硬伤的教材都可以用来入门,至于具体的 API 怎么用,用的时候现查手册就可以了,没必要把「学习 API 的使用」作为一个重点去攻克。

先总结那么多,欢迎补充!

http://www.bcwhy.com/thread-21734-1-1.html

时间: 2024-10-17 17:02:42

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

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

人的心理有个奇异的特性:一项知识一旦学会之后,学习过程中面临的困惑和不解非常快就会忘得干干净净,似乎一切都是自然而然,本来就该这种.因此,关于「怎样入门」这类问题,找顶尖高手来回答,未必能比一个刚入门不久的人来回答要好.就譬如最高票的那个回答,是一个非常精通 Windows 编程的高人回答的,但这种答案能给刚開始学习的人带来多少帮助,我这里想先打一个问号. 前段时间刚辅导了一个学生学会了 Win32 GUI 编程,刚好看到这个问题,顺手就邀请他回答了.并不是是给他布置总结作业,不过希望能从他这里

五本书籍助你从零基础学习java编程到精通之路

前天的文章给大家介绍了Java初学者应该学习哪些基础,亦是美网络小编从Java的三个大方向:J2SE.J2EE.J2ME对大家做了前景分析,这两天也收到了大家的很多反馈,很多小伙伴看了后对自己的Java编程方向有了比较明确的目标,也有小伙伴们说,要是能提供一些Java初学者应看的书籍就更好了,其实推荐Java书籍已经被规划在小编写的Java编程系列文章之中,常言道:书中自有黄金屋,书中自有颜如玉,下面亦是美网络小编给大家推荐的Java书籍中虽然没有黄金屋和颜如玉,但却能让Java编程的初学者快速

Windows编程基础

1. 控件() 使用Windows窗体时, 就是在使用System.Windows.Forms名称空间 大多数控件 都派生于System.Windows.Forms.Control类 1.1 控件属性 Anchor 控件的容器大小发生改变时, 该如何响应 Enable 是否可接收用户输入 1.2 控件的定位.停靠和对齐 1.3 事件 3种处理事件的基本方式 <1>双击控件 <2>Properties窗口中Events列表, 单击闪电图标, 就会显示Events列表      在Ev

Cordova 3.x 基础(1) -- 环境搭建(Windows / Android)

Cordova 3.x 基础(1) -- 环境搭建(Windows / Android) Mobile App分为三大类:Native App,Hybrid App,Web App.其中Hybrid App介于Native App和Web App之间,它能兼顾Native App的良好用户体验及强大的功能并具有Web App跨平台快速开发的优势.缺点在于依赖于各平台的WebView,WebView的性能好坏直接决定了Hybrid App的性能. 目前国内外的Hybrid App开发框架很多,比较

精讲shell基础以及如何高效的学习shell编程

1.前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具,Linux/UNIX系统的底层及基础应用软件的核心大部分涉及Shell脚本的内容.每一个合格的Linux系统管理员或运维工程师,都需要熟练的编写Shell脚本语言,并能够阅读系统及各类软件附带的Shell脚本内容.只有这样才能提升运维人员的工作效率,适应日益复杂的工作环境,减少不必要的重复工作,从而为个人的职场发展奠定较好的基础 1.2 学好Shell编程所需的基础知识

Windows编程基础之Rect

[Windows编程基础之Rect] 作者:Tocy????时间:2014-09-20 整理本文的最初目的是理清IsRectEmpty和IsRectNull函数的区别,但是在浏览msdn时发现有很多关于Rect函数都没有用过,因此整理下,以作记录并加深记忆. Rect,矩形区域,通常我们会使用四个坐标表示,一种表示法是矩形区域某个顶点坐标+区域宽高,一种表示法是使用矩形区域中相对的两个顶点.Windows下采用第二种表示,定义如下: typedef struct tagRECT { LONG l

java基础知识《JAVA 核心技术》学习笔记(一)

一:数据类型 (1)java整形: 类型                         存储要求 int                              4字节 short                          2字节 long                           8字节 byte                           1字节 (2)浮点类型 类型                         储存要求 float            

零基础学习Shell编程

一:起因 (0)也许由于一时的冲动使得你开始关注并学习shell编程:亦许由于是"道听途说"shell的威力很大:亦许由于shell编程的魅力:亦许由于作为一个coder的偏好:亦许-- (1)先来搞清楚为什么要学shell,学习要有目的性 ---- 简单的说shell就是一个包含若干行Shell或者Linux命令的文件.对于一次编写,多次使用的大量命令,就可以使用单独的文件保存下来,以便日后使用. shell简单.灵活.高效,特别适合处理一些系统管理方面的小问题 shell可以实现自

JavaScript基础--DOM对象(十三):(windows对象:history\location\navigator\screen\event)

DOM编程1.为什么要学习DOM(1) 通过dom编程,我们可以写出各种网页游戏(2)dom编程也是ajax的重要基础2.DOM编程介绍DOM = Document Object Model(文档对象模型)DOM是HTML与XML的应用编程接口(API) BOM和DOM相辅相成的关系BOM为纲,DOM为目,DOM是BOM的具体体现 3.DOM对象 3.1 Windows对象 3.1.1 confirm function test(){ var res= window.confirm("你要删除&