两者先后顺序不同,构造函数生成本类的对象,但没有产生窗口,OnCreate后窗口产生,然后才是视图的OnInitialUpDate,一般在这里对视图的显示做初始化。简单点,就是ONCREATE只是产生VIEW的基本结构和变量而在OnInitialUpDate()中,主要初始化视图中控件等。对各个变量进行初始化操作。
当应用程序被启动,或当用户从File菜单选择了New时候,或当用户从File菜单选择了Open时候,OnInitialUpdate()虚函数都会被自动调用。//CView基类中的OnInitialUpdate函数除调用OnUpdate函数中没做其它任何事情。如果在派生类中重载该函数一定要调用基类的OnInitialUpdate函数,或调用派生类的OnUpdate函数。当应用程序启动时,框架调用视图类的OnCreate函数之后立即调用OnInitialUpdate函数。
可能被多次调用 CView 对象在单文档界面 (SDI) 应用程序中的 OnInitialUpdate() 函数。需要仅当创建视图的窗口时,才执行任何初始化应在 OnCreate() 消息处理程序而不是在 OnInitialUpdate() 函数中。
例如AfxOleInit();//初始化COM库,就不要在OnInitialUpdate() 函数,因为OnInitialUpdate() 函数可能被多次调用,这时编译没错,运行Release程序不会错,但运行Debug程序会发生错误
OnInitialUpdate() 函数的使用,简单文档视图交互应用程序步骤(单文档单视图):
1)在派生文档类中定义文档的数据成员,用以保存程序中数据。为了方便派生视图类的访问可以将这些数据成员定义成公有类型或将派生视图类定义为派生文档类的友元类。
2)在派生视图类中对OnInitialUpdate虚成员函数进行重载。当文档数据被初始化或被从磁盘中读出后,框架会自动调用OnInittialUpdate函数。该函数对视图进行更新,以便放映出当前的文档数据。
3)在派生视图类中,让窗口消息控制函数和命令消息控制函数直接读取和更新文档数据成员,利用GetDocument函数对文档对象进行访问。
对应事件发生次序:
程序启动: CMyDocument对象被创建-》CMyView对象被创建-》视图窗口被创建-》CMyView::OnCreate函数被调用(如果被映射)-》CMyDocument::OnNewDocument函数被调用-》
CMyView::OnInitialUpdate函数被调用-》视图对象被初始化-》视图窗口无效-》CMyView:OnDraw函数被调用
用户编辑数据: CMyView类中函数对CMyDocument数据成员进行更新
退出程序: CMyView对象被删除-》CMyDocument对象被删除