首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MFC 單文檔多視圖:控制視圖創建順序的實用技巧

     編輯:程式設計疑難解答

問題背景

在 MFC 單文檔多視圖架構中,各視圖的 OnInitialUpdate() 調用順序會影響初始化邏輯(如視圖間相互依賴資料),但預設順序由框架決定,難以直接控制。

解決思路:延遲初始化 + 計數器同步

將順序敏感的初始化代碼從 OnInitialUpdate() 移出,封裝為獨立函數,由最後創建的視圖統一觸發。

實現步驟

  1. 定義全局或文檔級計數器:int g_viewInitCount = 0;
  2. 在每個視圖的 OnInitialUpdate() 中遞增計數器:
void CMyView1::OnInitialUpdate()
{
    CView::OnInitialUpdate();
    g_viewInitCount++;
    if (g_viewInitCount == TOTAL_VIEW_COUNT) // 最後一個視圖
        TriggerDelayedInit();
}
  1. 提取延遲初始化函數:
void TriggerDelayedInit()
{
    // 此處按期望順序調用各視圖的初始化邏輯
    pView1->DoRealInit(); // 先初始化視圖1
    pView2->DoRealInit(); // 再初始化視圖2
    pView3->DoRealInit(); // 最後初始化視圖3
}

關鍵點

  • TOTAL_VIEW_COUNT 為固定視圖總數,需與實際一致。
  • 視圖指標可在 CMainFrame::OnCreateClient() 分割視圖時保存,或通過文檔 GetFirstViewPosition() 遍歷獲取。
  • 避免在 OnCreateClient() 中調整分割語句順序,該順序不決定 OnInitialUpdate() 調用順序。

替代方案

若視圖間依賴關係複雜,考慮在文檔類 (CDocument) 中集中管理初始化流程,視圖僅負責顯示,文檔 OnOpenDocument() 完成後通知所有視圖更新。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved