標準 MDI 共享主框架工具欄,切換視圖需手動更新按鈕狀態。參考 Word:每個子框架擁有獨立工具欄/狀態欄,主框架隱藏,實現單文檔式體驗的多文檔架構。
CChildFrame 基類 CMDIChildWnd)。CChildFrame 基類改為 CFrameWnd,將 CMainFrame 的工具欄/狀態欄創建代碼移入 CChildFrame::OnCreate。CWinApp::InitInstance 中隱藏主框架:pMainFrame->ShowWindow(SW_HIDE)。WM_CLOSE 退出程序。
// ChildFrm.h
class CChildFrame : public CFrameWnd {
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
afx_msg int OnCreate(LPCREATESTRUCT);
afx_msg void OnClose();
};
// ChildFrm.cpp
int CChildFrame::OnCreate(LPCREATESTRUCT lpCS)
{
if (CFrameWnd::OnCreate(lpCS) == -1) return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) return -1;
if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, 4)) return -1;
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0;
}
void CChildFrame::OnClose()
{
CFrameWnd::OnClose();
AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_CLOSE_CHILD, 0); // 自定義消息
}
// MainFrm.cpp
void CMainFrame::CheckChildWnd()
{
POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition();
CDocTemplate* pTpl = AfxGetApp()->GetNextDocTemplate(pos);
if (!pTpl->GetFirstDocPosition()) PostMessage(WM_CLOSE); // 無文檔則退出
}
| 優點 | 缺點 |
|---|---|
| 視圖切換無需更新共享工具欄,各視圖擁有專屬 UI 狀態 | 主框架隱藏後,系統菜單、任務欄圖標行為可能異常 | 代碼結構更接近單文檔,易於理解維護 | 多文檔協作(如並排視圖)支持較弱 |