OnInitialUpdate 这个函数在MSDN中讲到,Override this function to
perform any One-Time initialization that requires information about
the document.d
OnInitialUpdate OnInitialDialog
两者性质差不多。
都是用于初始化界面的,由框架调用。
前者是在View即将显示时调用,后者则是在dialog即将显示时调用.
但是在之前做的一个东西中发现OnInitialUpdate 被调用了两次,一直没有
找到原因,在其它的demo中重新做也没有出现这个现象。今天终于在一篇帖
子中受到启发。
OnInitialUpdate 本身是指调用一次的,如create出来的view等情况下都正常。但是在下面的情况下就不一样了。
(下面的情况我试过了,可以用)
创建一个无文档支持的单文档(SDI)MFC应用,使用CSplitterWnd分割视图,重载CMainFrame::OnCreateClient,在其中一个分割区域(Pane)创建继承自CView的窗体(假设为class CMyView : public CListView),其它使用默认设置。重载CMyView::OnInitialUpdate方法并设置断点,你会发现这个方法被回调了两次
过一番调试发现,OnInitialUpdate的第一次回调发生在CSplitterWnd::CreateView方法中(winsplit.cpp),第二次回调发生在CMainFrame::LoadFrame方法中(winfrm.cpp),而两次回调都是由于这两个方法所给的参数CCreateContext *pContex为NULL引起的。
修改CXXXApp::InitInstance:
CCreateContext cc;
pFrame->LoadFrame(IDR_MAINFRAME,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, &cc);
就不会产生第二次OnInitialUpdate回调了。