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

MFC 程式設計師 WTL 指南 (4):工具列、狀態列、Rebar 與多窗格狀態列完整實作

     編輯:關於VC++

WTL CFrameWindowImpl 內建工具列、狀態列、Rebar 支援,本章詳細解析向導生成代碼結構、手動建立與更新流程、多窗格狀態列(CMultiPaneStatusBarCtrl)用法,透過 WTLClock2/3 範例專案演示完整整合過程。

框架視窗控制列成員

  • m_hWndToolBar:工具列或 Rebar 控制代碼。
  • m_hWndStatusBar:狀態列控制代碼。
  • m_hWndClient:客戶區視圖視窗控制代碼。

UpdateLayout()(由 OnSize 呼叫)負責重新定位控制列與調整客戶區大小。

簡易工具列與狀態列建立(向導預設)


LRESULT CMainFrame::OnCreate(...) {
    CreateSimpleToolBar(); // 使用 IDR_MAINFRAME 資源,風格 ATL_SIMPLE_TOOLBAR_STYLE (TBSTYLE_TOOLTIPS|WS_CHILD|WS_VISIBLE)
    CreateSimpleStatusBar(); // 載入字串資源 ATL_IDS_IDLEMESSAGE ("Ready"),風格含 SBARS_SIZEGRIP
    m_hWndClient = m_view.Create(...);
    // 訊息過濾器與閒置處理器註冊
    return 0;
}

CreateSimpleToolBar 內部呼叫 CreateSimpleToolBarCtrl 讀取資源建立按鈕;CreateSimpleStatusBar 呼叫 CreateStatusWindow。

顯示/隱藏控制列與 UI 更新


LRESULT CMainFrame::OnViewToolBar(...) {
    BOOL bVis = !::IsWindowVisible(m_hWndToolBar);
    ::ShowWindow(m_hWndToolBar, bVis ? SW_SHOWNOACTIVATE : SW_HIDE);
    UISetCheck(ID_VIEW_TOOLBAR, bVis);
    UpdateLayout(); return 0;
}

CUpdateUI 機制:BEGIN_UPDATE_UI_MAP 宣告 UPDATE_ELEMENT(ID, UPDUI_MENUPOPUP|UPDUI_TOOLBAR),OnCreate 呼叫 UIAddToolBar(m_hWndToolBar),OnIdle 呼叫 UIUpdateToolBar()。

工具列樣式變化

  • 平面風格:CreateSimpleToolBar(0, ATL_SIMPLE_TOOLBAR_STYLE | TBSTYLE_FLAT | TBSTYLE_LIST)。
  • Manifest 啟用 ComCtl 6.0 時自動套用平面風格。

Rebar 替代簡易工具列(多工具列支援)


HWND hToolBar = CreateSimpleToolBarCtrl(m_hWnd, IDR_MAINFRAME, FALSE, ATL_SIMPLE_TOOLBAR_PANE_STYLE);
CreateSimpleReBar(ATL_SIMPLE_REBAR_NOBORDER_STYLE);
AddSimpleReBarBand(hToolBar); // 可重複呼叫加入多條工具列

隱藏時僅隱藏 Rebar Band(ShowBand),而非整個 Rebar。CFrameWindowImpl 不支援 MFC 風格多點停靠,Rebar 是多工具列唯一內建方案。

多窗格狀態列 CMultiPaneStatusBarCtrl

  1. 成員宣告 CMultiPaneStatusBarCtrl m_wndStatusBar。
  2. OnCreate 建立:m_hWndStatusBar = m_wndStatusBar.Create(*this); UIAddStatusBar(m_hWndStatusBar);
  3. 設定窗格:int panes[] = { ID_DEFAULT_PANE, IDPANE_STATUS, IDPANE_CAPS_INDICATOR }; m_wndStatusBar.SetPanes(panes, 3, false);
    • ID_DEFAULT_PANE:彈出選單提示專用窗格,自動延伸全寬。
    • 其他窗格寬度由字串資源長度決定。
    • bSetText=false 先不顯示文字,後續透過 UI 更新設定。
  4. UI 更新映射:UPDATE_ELEMENT(1, UPDUI_STATUSBOX)(索引而非 ID),OnIdle 呼叫 UIUpdateStatusBar()。
  5. 初始文字:UISetText(1, _T("Running"));。
  6. OnIdle 定期檢查 GetKeyState(VK_CAPITAL) 更新 CAPS 指示窗格。

已知問題

UIUpdateStatusBar() 執行時 UISetText 對選單項目文字修改失效(選單文字不更新),若需動態修改選單文字請留意此限制。

下一章將進入對話框、控件封裝與 DDX 核心主題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved