CView的构造只应该放一些和视相关且独立于文档的初始化语句。所谓独立于文档,指每次打开新的文档时不会变化的属性。比如一个Windows自带的Notepad文本编辑器,里面有一个自动换行的选项,如果在这个.txt文件打开时用户将它打开了自动换行,则在打开下一个.txt时它都将继续保持为打开,不因为打开新的文档而变化。这个选项就应该在CView的构造中初始化。
OnInitUpdate只应该放一些和视相关且也相关于文档的初始化语句。比如Notepad中,每个文档打开时,都要自动根据.txt文件的前几个字节判断它的编码方式(是UTF8或是Unicode或是ANSI)。这个选项会因为不同的.txt的设置而不同,则应该在OnInitUpdate中检测文档的编码方式并记录起来(当然,编码方式这个选项在实际编写时很可能会作为文档类的属性而不是视的属性,在这里只是举例说明一下罢了)。
PreCreateWindow是CWnd的重载函数,特指当你需要新创建一种特性的窗口时(也就是子类化,不过MFC帮你封装了起来,使得使用从CWnd派生的形式来实现子类化一个新的特性的窗口,这也是为什么MFC会较其他窗口封装技术慢的主要原因之一,因为使用了虚函数),在创建之前调用PreCreateWindow以允许你设置一些这个新特性的窗口一些东西。比如窗口类(WNDCLASSEX)里的结构有指明此窗口是否需要接收鼠标双击消息,因此如果你的新特性的视需要接收鼠标双击消息,就应该在PreCreateWindow中设置。亦或者你的新特性的窗口不想有WS_BORDER风格(即不绘制边界,CView就会要求没有WS_BORDER)并且想强制说明此窗口只能作为子窗口创建,那么可以在PreCreateWindow中对cs.lStyle加上WS_BORDER和WS_CHILD风格
http://blog.youkuaiyun.com/wanglei5695312/article/details/5458684
初始化文档和视图
文档以两种不同的方法进行创建,因此文档类必须支持这两种方法。第一种方法,用户使用“新建文件”命令创建一个新的空文档。在此方法中,通过重写 CDocument 类的 OnNewDocument 成员函数初始化文档。第二种方法,用户使用“文件”菜单上的“打开”命令创建其内容为从某个文件读取的新文档。在此方法中,通过重写 CDocument 类的 OnOpenDocument 成员函数初始化文档。如果两个初始化都相同,可以通过两个重写调用公共成员函数,或者OnOpenDocument 可以调用 OnNewDocument 初始化未更改的文档,然后完成打开操作。
视图在文档创建之后创建。初始化视图的最佳时间是框架完成创建文档、框架窗口和视图后。可以通过重写 CView 的 OnInitialUpdate 成员函数初始化视图。如果需要在每次文档更改时重新初始化或调整任何内容,则可以重写 OnUpdate。