有一定基础的 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 编程,最重要的不是阅读什么教材,使用什么工具,而是先必须把下面几个对于刚開始学习的人来说很easy困惑的重要概念搞清楚:
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 编程就是一件相对easy的事情了。接下来仅仅要找一份新手教程,按部就班把例题都过一遍,再自己亲手写几个 GUI 小程序,差点儿相同也就上手了。这位学生在总结的时候提到说我推荐了一份非常有名的教程,非常抱歉让他失望了,那份教程事实上我自己都没看过,我仅仅是在网上随手搜了一个教程,看了一下文件夹,发现他入门须要的知识点上面都有列举,于是就发给他了。总之,入门
Windows 编程,最重要的是理解并掌握上面提到的几个基本概念,概念掌握了,不论什么一份不要存在严重错误和硬伤的教材都能够用来入门,至于详细的 API 怎么用,用的时候现查手冊就能够了,不是必需把「学习 API 的使用」作为一个重点去攻克。
先总结那么多,欢迎补充!
http://www.bcwhy.com/thread-21734-1-1.html
有一定基础的 C++ 学习者该怎样学习 Windows 编程?的更多相关文章
- 《Windows编程零基础学》第零节
首先很开心申请到了这一个专栏<Windows编程零基础学> 这是第一篇文章,在这里,我将讲述一些基础的知识. 什么是Windows编程 所谓Windows编程就是在Windows平台上开发 ...
- 英语是学习Java编程的基础吗
就当前市场行情需求来看,Java人才需求依旧火爆,在如今互联网时代,手机移动端的软件开发是非常重要的,如今无论是大中小企业都是需要进行软件的开发的,又因为Java是开源的使用起来可以节约一大批的成本, ...
- Web编程基础--HTML、CSS、JavaScript 学习之课程作业“仿360极速浏览器新标签页”
Web编程基础--HTML.CSS.JavaScript 学习之课程作业"仿360极速浏览器新标签页" 背景: 作为一个中专网站建设出身,之前总是做静态的HTML+CSS+DIV没 ...
- Windows编程基础
主要内容:介绍Windows编程的一些基础概念 1.窗口的概念 <1>一个应用程序的窗口通常包括控制菜单框.下拉菜单. 工作区以及最大化按钮.最小化按钮, 还有垂直滚动条.水平滚动条 &l ...
- 《零基础学JavaScript(全彩版)》学习笔记
<零基础学JavaScript(全彩版)>学习笔记 二〇一九年二月九日星期六0时9分 前期: 刚刚学完<零基础学HTML5+CSS3(全彩版)>,准备开始学习JavaScrip ...
- 零基础学Python不迷茫——基本学习路线及教程!
什么是Python? 在过去的2018年里,Python成功的证明了它自己有多火,它那“简洁”与明了的语言成功的吸引了大批程序员与大数据应用这的注意,的确,它的实用性的确是配的上它的热度. Pyt ...
- Java基础及JavaWEB以及SSM框架学习笔记Xmind版
Java基础及JavaWEB以及SSM框架学习笔记Xmind版 转行做程序员也1年多了,最近开始整理以前学习过程中记录的笔记,以及一些容易犯错的内容.现在分享给网友们.笔记共三部分. JavaSE 目 ...
- go 学习笔记之学习函数式编程前不要忘了函数基础
在编程世界中向来就没有一家独大的编程风格,至少目前还是百家争鸣的春秋战国,除了众所周知的面向对象编程还有日渐流行的函数式编程,当然这也是本系列文章的重点. 越来越多的主流语言在设计的时候几乎无一例外都 ...
- 协议基础:SMTP:使用Telnet学习SMTP协议
协议基础:SMTP:使用Telnet学习SMTP协议 2018-07-30 20:05:50 liumiaocn 阅读数 7479更多 分类专栏: 工具 Unix/Linux 版权声明:本文为博主 ...
随机推荐
- UIScrollViewA都PI得知。
//1.设定滚定条的样式 typedef NS_ENUM(NSInteger, UIScrollViewIndicatorStyle) { UIScrollViewIndicatorStyleDefa ...
- BootStrap布局案例
BootStrap布局 bootstrap 2.3版与3.0版的使用区别 http://www.weste.net/2013/8-20/93261.html 以一个博客系统的首页,来介绍如何布局 1, ...
- 使用DbUtils实现CRUD
commons-dbutils 这是 Apache 提供了一个开源组织 JDBC工具库,它是JDBC简包,学习成本低,和使用dbutils可以大大简化jdbc的工作量,同一时候也不会影响程序的性能.因 ...
- Oracle Instanc Client安装命令工具
条件 1.Linux RHEL 6.X X86_64操作系统 2.从安装Oracleserver的server此次收购Oracle相关文件(同OS) 软件下载 从Oracle包: 1) instan ...
- html风格的滚动条
DIV辊棒的设置 (CSS)2008/09/26 03:07div 控制滚动条2008年01月06日本 星期日 01:181)隐藏滚动条<body style="overflow-x: ...
- 使用 Gradle 插件进行代码分析(转)
代码分析在大多数项目中通常是作为最后一个步骤(如果做了的话)完成的.其通常难以配置及与现有代码整合. 本文旨在勾勒出使用 Gradle 整合 PMD 与 FindBugs 的步骤,并将其与一个现有的 ...
- 【Web探索之旅】第一部分:什么是Web?
内容简介 1.Web探索之旅:开宗明义 2.第一部分第一课:什么是Web? 3.第一部分第二课:Web,服务和云 4.第一部分第三课:Web的诞生史 Web探索之旅:开宗明义 大家好. 我们这个系列课 ...
- iOS 9 新特性
这篇文章介绍了iOS9开发相关的简介,现在发布的设备都会搭载iOS9.这篇文章也列出了详细描述新特性的文章. iPad多线程增强 iOS9使用Slider Over, Split View, Pict ...
- 证明 poj 1014 模优化修剪,部分递归 有错误
这个问题是存在做.我发现即使是可行的一个问题,但不一定正确. 大部分数据疲软,因为主题. id=1014">poj 1014 Dividing 题目大意:有6堆石头,权重分别为1 2 ...
- Oracle中REGEXP_SUBSTR及其它支持正则表达式的内置函数小结
Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下:在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20','23'的集合. REGEXP_SUBSTR函数格 ...