首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

模擬 Word 多文檔界面:將工具欄/狀態欄下沉到子框架

     編輯:關於VC++

核心思路

標準 MDI 共享主框架工具欄,切換視圖需手動更新按鈕狀態。參考 Word:每個子框架擁有獨立工具欄/狀態欄,主框架隱藏,實現單文檔式體驗的多文檔架構。

改造步驟

  1. 生成標準 MDI 專案(CChildFrame 基類 CMDIChildWnd)。
  2. CChildFrame 基類改為 CFrameWnd,將 CMainFrame 的工具欄/狀態欄創建代碼移入 CChildFrame::OnCreate。
  3. CWinApp::InitInstance 中隱藏主框架:pMainFrame->ShowWindow(SW_HIDE)。
  4. 子框架關閉時通知主框架檢查是否還有子窗口,無則發送 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 狀態主框架隱藏後,系統菜單、任務欄圖標行為可能異常
代碼結構更接近單文檔,易於理解維護多文檔協作(如並排視圖)支持較弱
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved