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

MFC 單文檔多視圖:透過 CMainFrame 取得各視圖指標

     編輯:程式設計疑難解答

問題

單文檔多視圖架構下,如何在 CMainFrame 中取得特定視圖(如 CTreeView、CRichEditView)的指標以進行跨視圖操作?

解決方案:使用 CSplitterWnd::GetPane

分割視窗容器 CSplitterWnd 提供 GetPane(row, col) 取得該格子的 CView* 指標,再 dynamic_cast 轉為具體視圖類型。

程式碼範例

// 在 CMainFrame 中
void CMainFrame::OnSomeCommand() {
    // 假設 m_wndSplitter 為 1 行 2 欄,左側 (0,0) 為 TreeView
    CView* pView = m_wndSplitter.GetPane(0, 0);
    CTreeView* pTreeView = dynamic_cast(pView);
    if (pTreeView) {
        // 操作 TreeView
        pTreeView->GetTreeCtrl().SelectItem(...);
    }

    // 右側再分割 m_wndSplitter2 (0,1) 內部 1 行 2 欄
    CView* pRichView1 = m_wndSplitter2.GetPane(0, 0);
    CRichEditView* pRich1 = dynamic_cast(pRichView1);
    // ...
}

注意事項

  • GetPane 回傳 CView*,必須 dynamic_cast 驗證型別安全。
  • 視圖建立時機:OnCreateClient 完成後才能取得有效指標。
  • 若視圖尚未建立(如動態建立),需在 OnCreateClient 返回 TRUE 後再操作。

進階:文檔-視圖架構下的資料共享

所有視圖共用同一 CDocument 衍生類實例。透過 GetDocument() 取得文檔指標,視圖間透過文檔交換資料,符合 MFC 文檔/視圖架構設計初衷。

// 在任一視圖中
CMyDoc* pDoc = GetDocument();
pDoc->UpdateData(newData); // 修改文檔資料
pDoc->UpdateAllViews(this); // 通知所有視圖重繪
  1. 上一篇文章:
  2. 下一篇文章: