1. 程式人生 > >OnInitialUpdate 被呼叫兩次問題

OnInitialUpdate 被呼叫兩次問題

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回調了。