在 MFC 的 MDI (Multiple Document Interface) 架構中,開發者常遇到這樣的需求:使用者在樹狀控制項中雙擊某個項目,該項目儲存著一個 CDocument 指標,程式需要將對應的文件視窗帶到前景並使其成為作用中的視窗。乍看之下似乎只要「啟動文件」即可,但實際上 文件本身無法被啟動,只有視窗可以。
在 MDI 架構下,每個文件通常關聯一個或多個視圖 (CView),而每個視圖又包含在一個 MDI 子視窗框架 (CMDIChildWnd) 中。因此,要讓某個文件成為作用中文件,實際上是要啟動其所屬的 MDI 子視窗框架。
POSITION pos = pDoc->GetFirstViewPosition();
CView* pView = pDoc->GetNextView(pos);
GetParentFrame() 可獲得第一個 CFrameWnd 父視窗,在 MDI 應用中這通常是 CMDIChildWnd:CFrameWnd* pFrame = pView->GetParentFrame();
CMDIChildWnd 並呼叫 MDIActivate():CMDIChildWnd* pChild = static_cast<CMDIChildWnd*>(pFrame);
pChild->MDIActivate();
GetFirstViewPosition() / GetNextView() 只會取得第一個,需依據業務邏輯選擇適當的視圖。CMDIChildWnd 轉型會失敗。透過「文件 → 視圖 → 父框架 → MDI 啟動」的指標鏈結,即可在 MDI 應用中將任意開啟的文件視窗帶到前景,實現使用者預期的「啟動文件」行為。