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。
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)。
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 m_wndStatusBar。OnCreate 建立:m_hWndStatusBar = m_wndStatusBar.Create(*this); UIAddStatusBar(m_hWndStatusBar);int panes[] = { ID_DEFAULT_PANE, IDPANE_STATUS, IDPANE_CAPS_INDICATOR }; m_wndStatusBar.SetPanes(panes, 3, false);
ID_DEFAULT_PANE:彈出選單提示專用窗格,自動延伸全寬。bSetText=false 先不顯示文字,後續透過 UI 更新設定。UPDATE_ELEMENT(1, UPDUI_STATUSBOX)(索引而非 ID),OnIdle 呼叫 UIUpdateStatusBar()。UISetText(1, _T("Running"));。OnIdle 定期檢查 GetKeyState(VK_CAPITAL) 更新 CAPS 指示窗格。UIUpdateStatusBar() 執行時 UISetText 對選單項目文字修改失效(選單文字不更新),若需動態修改選單文字請留意此限制。
下一章將進入對話框、控件封裝與 DDX 核心主題。