回复:“我是VC的初学者,向我推荐几本好书吧?”

       最近有几位朋友,问我大意如下的话:“我是VC的初学者,向我推荐几本好书吧?”,或者是问我:“C++和VC,我该学哪种语言?”
       从他们的眼神里我看得出,他们是很真诚的在问我,说实话,我也是真的想告诉他们你该怎样怎样,但我不禁又想起了我当初那时在C语言老师实验室里的事[详见:我的计算机-软件开发之路(2) ],我又不知道到底该怎样用几句话来很清楚的表达我的意思了。很早就想写一篇这样的文章,以后谁问我的时候,建议他/她来读一下就好了。

       首先,我的VC水平一般,MFC的使用只能算的上熟练。我只想从我的个人经历和感受出发,谈一些我的看法。
       从大一算起,我已经学和使用VC6六年了,回过头来看我当初的学习经历,我无法确定我当初走的路是否是正确的,或者是合理的,再或者是适合于问我上述问题的每一个人的,于是我打算把自己当初的那段经历客观叙述评价出来,希望能够对问我问题的朋友有所帮助。
1、我在高中时是有一定的编程基础的,我在大一上学期时就已经看完了C语言,下学期用了两个月的时间看完了C++了,当然我所说的看完,从一定意义上讲,只是对C和C++的语法和特性有了一定的了解,至少当你看到一段代码的时候,你会立刻说:噢,这是C++的语法格式,而不是basic或pascal的。而且你要把面向对象的那些特征,至少要了解一些,不然你看MFC里的那些代码,可能会很不适应的,感觉什么都很陌生。
插入一段:事实上各种编程语言,单纯从语言本身来讲,他就是一种描述方式:是我们需要解决的问题的一种表达方式;当然不同的语言会有不同的特征,会体现不同的思想(或者称为:设计理念)。比如面向过程的语言:C,BASIC,PASCAL;不完全面向对象的语言:C++,完全面向对象的语言:java,c#等;当然面向过程与面向对象是两种表达和设计思想,是与语言无关的,在C语言中,你也可以使用面向对象的思想,而事实上很多大的项目都是这样做的,当然包括汇编语言也一样,只是C++, java等语言在设计的时候单从语法结构上就已经很好的体现了面向对象的思想,因此你会觉的使用C++和java来实现面向对象的设计至少在代码的编写和代码的形式上会显的比用C实现更容易,更清晰一些。

       VC6是一种编程工具,他是一个平台,是你用C++语言在它那里面写代码。当然单纯的C++语言只能用来实现一些算法的设计和实现。你要是搞算法的话,你直接就用VC6的console模式就好了,就像你曾经用过的dos模式下的tc,bcb一样。
       你说你想写一个程序,用来显示一个标准的windows对话框,里面一个按钮,一点击它就会弹出一个对话框,上面显示:"u r a pig!",那单纯的语言是做不到的,首先你需要搞清楚,你需要实现的是一个在windows下的可执行文件:扩展名是“exe”,而且你需要显示一个标准的windows对话框,windows是一个操作系统,你如何让它显示呢,这需要windows给你一定的权限,于是这就是API(application programing interface),我翻译成“应用开发接口”,简单一点的比喻,就是好比一些口令和猫眼,你对它说:pig,他可能就会弹出一个对话框,上面写着:"u r a pig";你使用另一个api,你可能会看到:噢,我发现当前进程里的一个应用程序,他的窗体标题是:"傲游[maxthon]",当然,实际情况要比这复杂的多,我只是打个不太恰当的比喻。
       通俗一些来说: windows api是为开发windows应用程序提供的,是可以获得一定操作windows应用程序能力的一堆函数。如果你在VC6里面用c++语言再配合上单纯的windows api来开发的,这属于windows SDK应用开发,SDK(Software Development Kit)意思是:软件开发程序包,实际上是一堆主要是动态链接库(dll)的包,你可以调用里面的函数,你要问我dll是什么东西,我劝你还是暂时不要知道了,以后慢慢会了解的,你现在只需要知道你调用的那些函数有一些是系统自带的api,有一些是写在那些dll里的。

       当然初学VC6,一般是先接触MFC的。从普遍意义的科研角度来说的,科研工作者往往是想实现一种算法,而算法的实现是需要一定的平台,单纯的console模式有时无法满足他们的要求,因为他们有时需要更可视化,更形象化的显示他们的实验结果,有时他们还需要在实验的中间段暂时中断他们的算法,并查看或修改其中的某些参数,这些都属于UI的范畴,即用户交互。而从应用程序的效率和易用性上来讲,我所了解的情况,大家多数是选择:VC6的console(纯算法,交互性质的操作不多时选用)和MFC(更多的是注重交互性,但也要考虑高效率)。
当然:我要补充声明,我上述所讨论的前提是在windows操作系统下的windows应用程序。

MFC是什么?
MFC:Microsoft Foundation Classes,主要是微软为了方便大家使用API而对其进行了一定程度的封装,当然他也提供了一定的框架,你只要按照他的框架模式去开发,就可以更便洁的开发出标准的windows应用程序。
不知有没有人读过陈宽达的那本《delphi深度历险》,那里面作者把delphi的VCL(visual componet library)比喻成屠龙刀,厚重而又功力深厚,把VC的MFC比喻成倚天剑,薄薄的一层当然锋利无比,威力巨大。虽然有些夸张,但还是很形象的。同delphi的可视化组件库来比,VC的MFC封装确实要薄很多,在MFC里面你到处可以看到API的影子,很多函数都是同名的API函数在MFC的扩展类中的应用。好了,MFC就先说到这吧。不然又扯远了。
再接着上面的说:
2、我在一开始学习VC的时候,用的是一本北京希望的很薄的一本书,讲的很简单,但就那本书还是让我晕了整整七天才开始有点感觉。主要是我当初对 windows的消息机制完全不了解。后来我开始照着那本书上面的例题,一行行的敲代码,逐渐的了解了开发基于对话框的应用程序的模式。
再后来就是基于文档/视图结构,第一个函数就是CXXXView::OnDraw(CDC *pdc),我没写错吧,呵呵。至于文档/视图结构,我有一个观点就是:你所看到的东东都是画出来的,不要被它的表面现象所迷惑。而且我认为大多数使用文档/视图结构的朋友,需要过的第一关就是:ondraw
然后是onpaint,即更好的画
接着是:CXXXView,CXXXDoc,CMainFrame之类的关系,当然首先要看单文档,然后再看多文档。

以下是我对学习VC6的一些建议:
首先问你一个问题:VC6,你到底该学什么?其实VC6只是一种编程工具,它涉及的方面是很多的,首先你要弄清楚你为什么要用VC6,你用VC6是来做什么的,当然每个人的答案可能是不一样的,但你需要首先搞清楚这些问题。你要问我:VC6能做什么?那我只能说:google,baidu,关键字:vc,搜吧。

1、首先最好具备一定的C++的基础
(当然不要和我叫针,你要告诉我你当初只会C,甚至什么都不会就开始学VC,然后学的很好,那你牛,但不具有普遍意义)
2、先找本比较薄的书而且上面有一定的实例讲解的书看,不要指望一口吃个胖子,初学VC是很郁闷的,你会发现有N多问题,打个比方:VC6就好像一个不透明的庞然大物,不要说看穿他里面了,就是光表面,也够你看些日子的,你往往一开始看到了只是他表面上的一个角,当然会有很多问题,逐渐的等你看的多了,表面的轮廓就清晰了,再逐渐的表面的细节也清晰了,再逐渐你可以跟踪他的内部细节了。(好像说了一堆废话啊)。有些时候是需要不求甚解的,因为在你当时的那个水平,是无论如何也无法甚解的,等你看的多了,懂的多了,自然就甚解了。初学VC,很大程度上是要靠模仿的,就照着书上的例子做,多做几个例子,实践与理论是要互相结合的。
3、书是由薄看到厚,再由厚看到薄的。前者是你的知识的汲取过程,后者是你的知识的吸收和消化过程
4、路是要靠自己走出来的,喜欢问问题是好的,但我更倾向于自己去发现问题解决问题,毕竟人生更多的是自我发展的过程,老师是很有限的,自己主动的去摄取知识吸收知识感悟知识是我一直以来的信条。
4、兴趣和爱好是人最好的老师,大意如此的话,好像小爱说过。你说你没兴趣学VC6,那你为什么还要学呢,老板让我做一个项目,指名要用VC6,这就是压力,当然也是动力了,没有动力,就自己找动力吧,其实写程序是很有成就感的,当你在写程序的过程中遇到问题,然后费了九牛二虎之力解决了这个问题,然后看着自己的程序很秀的运行的时候,那种成就感只有真正体现过的人才会明白。虽然也许在别人眼里,你写的程序功能是如此的简陋,比你好的程序在网上有的是,但在你的眼里,那是属于你的,它是如此的美丽。
5、在实践中提高。当你马上需要用VC6做一个项目,而你又什么都不会时,那动力立刻就来了,即使你不是很着急的赶做某个项目,在实际的项目中学用VC,也会事半功倍。本科的学生也可以试着用VC做一些小的应用软件,在做的过程中遇到问题解决问题,这样才会有针对性,相信你会提高的很快的。

       我一直以来写文章的方式都是想到什么说什么的,条理性可想而知,上面的内容相信可能也已经验证了我的这个毛病。我刚刚以一个初学者的身份读了我上面所写的内容,竟然发现,看了之后,我依旧一脸茫然,不知所措。我很遗憾,我的表达能力和我的VC水平实在有限,无法像侯俊杰那样:一本《深入浅出MFC》,让学VC的大都人手一本放在案前。我实在是没有说出什么到底应该让初学VC的人具体去做什么事情的话来。本来这篇文章的话题是要我推荐几本书的,结果我却扯了这么多边外话。至今还支字未提推荐书的事。
       我当初所处的环境和我当时的素质决定了我无法说去找哪几本书比较好,专门读哪几本书就OK了,我是那种遍历型的,就像我当初在高中做那道编程题一样,我遍历了阅览室里几乎所有我能找到的关于C++和VC的书,这其中肯定是良莠不齐了,而且刚开始时我根本不知道到底什么是比较好的书,因为我的VC6完全是自学的,当时的我还不具备这个素质,当然好与不好的定义本身就是一个模糊的概念。只是到后来,我认为感兴趣比较好的某些内容就慢看,细看;不感兴趣甚至是垃圾的篇节就直接skip的啊。这实际上也从客观上训练了我分辨优劣的能力,也可以说是精读与略读的能力。而且我现在也不是很想评价到底哪本书好,哪本书坏,事实上在网上有很多人推荐,很多人评价。比如Dear book,和china-pub,五星级的书大都是好书吧,但有一点是肯定的,一本书是好书只能说明它是一本更有价值的书,但不一定是一本更适合你的书,我还是那个观点:书是从薄到厚的,我当初学习C++ 时,一开始看了一本清华的,一本北大的,都很厚,根本抓不住C++的本质;后来偶然的机会看了一本北航的,很薄的一本书,也就100页吧,才恍然大悟,至少终于知道C++的大体框架scheme了。 
       我现在的案前放的关于VC的书,只有一本,《MFC经典问答》我可以推荐,把它作为你查阅的工具书来看还是不错的。
       还有一本书是:《数据结构、算法与应用-C++语言描述》,(美)Sartaj Sahni著,国内翻译,机械工业出版社
       噢,对了,有一本书是我的同事专程让我推荐的:《学用Visual C++ 6.0》,他说比较适合初学者。
       另外我现在用VC6写程序时,一般使用的帮助只有两个:msdn和搜索引擎。
       当然我再说一遍:VC6只是一种编程工具,作为一名科研工作者更需要的是理论和算法方面的学习和提高。

补充说明
1、鉴于本人的能力和时间关系,文中难免会有错误或偏颇之处,欢迎大家批评指正,以免误导初学VC的朋友。
2、本文讨论的前提是写给那些已经打算想学VC的朋友,因此欢迎大家提出您对初学VC或者初学编程的好的建议和意见。
     本人谢绝建议学习其他编程工具或语言的朋友在此回复,也同时谢绝无关言论在此回复,谢谢理解。
3、欢迎有一定VC学习经验的热心朋友推荐您所认为值的一读的关于VC的书籍,同时请尽量注明:您是如何看待该书的,该书比较适合于VC掌握到何种程度的朋友阅读。谢谢您的支持!
                                                                                                                                 vcfly
                                                                                                                              2004/12/1 14:45       
posted on 2004-11-30 21:36  vcfly  阅读(1859)  评论(3编辑  收藏  举报