一直纠结于究竟该用什么标题:总结其实说不上的,毕竟自己经验也不怎么丰富,充其量也就是一小结;换用感悟之类的也不大合适,这会让人以为我故作老成、经验丰富,诱骗大家,知根知底的朋友们当然很容易就揭穿我了。想来想去,虽然以后还有很长的路要走,但就暂且用“总结”来回顾一下自己做界面开发的一些经验和心得吧。
第一语言是C++,所以当初选择学习MFC似乎是理所当然的了。这是我最开始上网找资料以决定学什么时认定的道理,那时以为这是当然的嘛,可在过去这么长时间后,回头想想,甚是为自己的盲目而汗颜。我不是说MFC不好,在我看来,MFC是十分强大而优秀的,因此才会成为VC开发人员的首选。它的框架之庞大复杂,虽然使得其功能强大,而且拓展性强,但对于初学者来说实在太过晦涩,其架构和模版在简单明了的windows程序基础上加入了大量设计模式和其他常见的界面开发理念,如所见即所得和文档/视图模型,而这些东西,对于初学者来说是很难理解的。初学者固然可以通过模版向导来生成一个程序框架,也可以在窗口设计器里用鼠标拖拽出你的窗体,但除此之外呢?在相当长一段时间里,我只知道该怎么用MFC,但不知道为什么,经常性的觉得它的模版的架构是莫名其妙。
因为经常性的要用到,所以我经常为给程序加入某个功能而到处查资料,实现后却也只是一知半解,即使在我浏览过几遍精通MFC等书,依然无法为我答疑解惑,即使是最权威的《mfc windows程序设计》一书也是如此。我一度怀疑自己的学习方法,后来知道,问题的根本不是学习方法,而是学习顺序。提到的这些书,都是工具书,也仅仅是工具书而已,对于经验丰富的老鸟,它们能够提供查询等价值,但对于初学者它们只能告诉你可以这样做或者应该这样做,而无法告诉你为什么要这样做。但我相信,每一个有学习欲望的人,都是渴望了解为什么的,这也是为了能继续前进而必须要解决的。
要学习一套类库最好的方法是看文档和代码,但很可惜MFC是不开源的,它的封装太成功了,完美到让每一个使用它的人难以深入到底层,也就不能洞悉一切,只能盲目的在模版的框架下机械的是用一些类和API。

窗口之间是如何通信的?系统消息如何发送与接收?还有鼠标键盘的各种操作,自定义消息的处理,这些是初学者学要掌握而在MFC框架下很难看到的细节,当你需要使用这些东西时,你会发现不论使用多少次,这些东西永远都是这么陌生。是的,当然会感到陌生了,因为MFC的关系,我们离这些东西的实现太远了。
后来我冷落了MFC一段时间,在我看来,它就是一个怪物,实在难以驾奴。我的突破来自一本书,是关于windows程序设计的,但不是讲MFC的,我在翻看mfc windows程序设计一书的序时,看到作者提到了这本书,叫《Programming Windows》,于是我去看了,然后顿悟了。我觉得每一个学习窗口程序开发的人都要看一看这本书,而且要精读,不管你使用的是什么语言,都可以拿来参考。
当我初学MFC时遇到问题上网寻找解决方法,总是会找到一些很奇怪的方法,这些方法一眼看去就不是MFC框架里的东西,很显然要底层的多,有各种系统的API,还有大量的全局函数,甚至还有不少内核级函数,比如检测鼠标键盘状态,发送系统消息,设置系统热键,获取消息队列等,这些东西从哪里来的?现在我知道,都可以从《Programming Windows》中找到解答,而且是告诉你为什么。
于是后来抛开了MFC的那套模版的类库,仅仅基于windows API来写自己的窗口,处理消息,这样的效果的显著的,如果连这样过程式的窗口处理都理解不了无法驾奴的话,你怎么去掌握并精通MFC那一套庞大复杂的经过精心封装的类库呢?
到这里我才感觉界面开发的学习总算是到了一个阶段。你能够认识到,所谓的窗口程序,看上去很复杂,但在我看来只有两样东西,那就是窗口和消息队列。这种认识类似于行家去繁就简的能力,初学者看来是一团乱麻,真正了解的人却知道,所有的东西都是虚的,是为了实现一个功能而包装成这样或那样,但真正的基础,确实再简单明了不过了。后来看过一些其他的开发库,比如Qt,CEGUI等,无论各个库是如何宣传的,比如Qt的信号和槽,CEGUI的事件注册和回调函数等,在这种认识基础上都是统一的,或者说这些界面开发库设计的出发点都是差不多的,窗口的背后是一个消息队列。
我觉得如果如果能够有这样的认识,那就算是进入到第一个阶段了,这时的你能够理解窗口程序的真正意义,窗体和消息队列成为了你的工具,你发现自己能够随心所欲的操纵窗口做任何事情。这个阶段的你能完成的功能有两个典型例子,一个是基于窗口的多窗体通信,另一个是基于系统消息队列的钩子程序。
是的,到这里我们已经可以完成看起来比较复杂,功能上也足够强大的窗口程序了,但人的需求是无限的,这时我们就会觉得自己的窗口太单调,不够漂亮……

界面程序开发的一些总结(三)

然后最痛苦的时候来了,尽管已经了解并掌握了几乎所有必需的知识,对于一个任务,我们能从功能上比较完美的实现,但这个时候,我们已经站上一个高度,追求完...

阅读全文

界面程序开发的一些总结(二)

经过在第一阶段的痛苦磨炼,我们总算是打下了比较坚固的基础,可以快速的开发各种常见的窗口程序,各种控件的应用比较熟练,也能利用消息机制完成各种需要的...

阅读全文

发表评论