文档视图结构在MFC的学习过程中占据很重要的位置,在各种关于MFC学习的书中也占据着很重要的篇章,其实我认为首先要明白Document-View到底为我们做了什么,为我们在写程序中提供了那些方便,Document-View-Frame是怎么一块产生的,Document的作用到底为了什么,View的作用是为了什么而存在以及MFC是怎么管理这三者的。
在MFC中,程序是通过文档模板(Document Template)来管理这三者的,在Loadframe的时候就会查找文档模板三位一体地创造出来,当然中间也经过了好多的曲曲折折的函数的调用,在程序中Document实际上就是数据的容器,因为从根本上来说,一个应用程序的出现就是为了处理相应的数据的,不处理数据的应用程序估计没什么用吧,View就是Document的表现,如果一个程序确实帮我们处理完成了应该做的事情,却没有通过一个我们比较容易理解的方式显现出来那我想也应该是很痛苦的,知道了这两者这种基本的关系之后再来看MFC的Document-View结构为我们实现了什么,从宏观入手,逐渐到微观,这样在做具体的事情时候就不会忘记做这个事情的目的,不至于迷茫,MFC的这个框架结构为了让我们方便地实现数据的处理和显示把一些比较固定和琐碎的细节给固定好,帮我们实现过了,这样就可以使我们将主要的精力放在对数据的处理和功能的实现上。但在学习MFC的过程中,要做相反的工作,要想利用好这个结构,就要先深入地了解它,就像候俊杰在《深入浅出MFC》总说的:唯其深入,才能浅出。
一般来说,一个应用程序,数据只有一份,但却可以通过各种方式来把它显示出来,还要可以通过对View的操作来修改Document的数据完成用户的交互,这就是Document和View之间数据的一致性变得很重要,当然MFC已经帮以虚函数的形式帮我们实现了保持数据同步的借口,我们只用在合适的时候调用这些虚函数就行了,这些虚函数有updateallview,onupdate等,另一个关系很重要的方面就是对数据的永久存储,就是seriliziation问题,这个函数是Document的难点,File open和File Save两个菜单命令都调用了这个串行化的函数实现了数据的读入和存储,这里不细说,如果用到的话还得需要对这个函数继续找点资料看看。到这个时候,基本上知道了学习MFC的技巧了,所需的就是多动手锻炼,提高动手的能力。
在写程序中用到的一个主要的东西就是对话框(Dialog),前两天我还未对话框消息的传递郁闷来着,由于对话框消息传递有点复杂,虽说控件的消息一般都是在父类的对话框中接受被处理,但控件可以发出不懂得消息,老的控件可以发出WM_COMMAND,一些新的控件如treectrl和listctrl是以WM_NOTIFY的消息形式发送给父对话框的,而且还有一个消息反射机制在作怪,控件的使用,虽说技术含量不过,但是却也是很琐碎复杂的,能够用好空间的作用,能够很大提高写程序的效率的。