在 MFC 單文檔多視圖架構中,各視圖的 OnInitialUpdate() 調用順序會影響初始化邏輯(如視圖間相互依賴資料),但預設順序由框架決定,難以直接控制。
將順序敏感的初始化代碼從 OnInitialUpdate() 移出,封裝為獨立函數,由最後創建的視圖統一觸發。
int g_viewInitCount = 0;OnInitialUpdate() 中遞增計數器:void CMyView1::OnInitialUpdate()
{
CView::OnInitialUpdate();
g_viewInitCount++;
if (g_viewInitCount == TOTAL_VIEW_COUNT) // 最後一個視圖
TriggerDelayedInit();
}
void TriggerDelayedInit()
{
// 此處按期望順序調用各視圖的初始化邏輯
pView1->DoRealInit(); // 先初始化視圖1
pView2->DoRealInit(); // 再初始化視圖2
pView3->DoRealInit(); // 最後初始化視圖3
}
TOTAL_VIEW_COUNT 為固定視圖總數,需與實際一致。CMainFrame::OnCreateClient() 分割視圖時保存,或通過文檔 GetFirstViewPosition() 遍歷獲取。OnCreateClient() 中調整分割語句順序,該順序不決定 OnInitialUpdate() 調用順序。若視圖間依賴關係複雜,考慮在文檔類 (CDocument) 中集中管理初始化流程,視圖僅負責顯示,文檔 OnOpenDocument() 完成後通知所有視圖更新。