單文檔多視圖架構下,如何在 CMainFrame 中取得特定視圖(如 CTreeView、CRichEditView)的指標以進行跨視圖操作?
分割視窗容器 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); // 通知所有視圖重繪