工具欄基礎:TToolBar + TImageList 四步走

- 拖放 TImageList,雙擊打開編輯器,匯入圖示 (BMP/PNG/ICO),設定 `Width`/`Height` (如 16x16、24x24)。
- 拖放 TToolBar,設定 `Images = ImageList1`、`ShowCaptions = True` (可選)、`Flat = True` (扁平化風格)。
- 右鍵 `TToolBar` → `New Button` 新增按鈕,屬性設定 `ImageIndex` (對應 ImageList 索引)、`Caption`、`Hint`、`ShowHint = True`。
- 雙擊按鈕進入 `OnClick` 事件撰寫業務邏輯。
進階:IE 風格可停靠工具欄三種實現
核心組件:TCoolBar (Win32 ReBar 封裝) 或 TControlBar (VCL 純碼實現) + TToolBar + TImageList。
方案一:TCoolBar + TToolBar (最接近原生 IE)
- 放置 `TCoolBar`,`Align = alTop`。
- 在 `TCoolBar` 上放置 `TToolBar`,調整高度,`AutoSize = True`、`Flat = True`。
- `TToolBar.Images = ImageList1`,右鍵新增按鈕/分隔條 (`New Separator`)。
- 運行時可拖曳 `TToolBar` 在 `TCoolBar` 內水平移動、甚至拖出成獨立浮動視窗 (需 `TCoolBar.Bands` 設定 `FixedSize = False`、`Break = False`)。
方案二:TControlBar + TToolBar (純 VCL、無 COM 依賴)
- 放置 `TControlBar`,`Align = alTop`、`AutoDrag = True`、`DragKind = dkDock`。
- 在 `TControlBar` 上放 `TToolBar`,`DragKind = dkDock`、`DragMode = dmAutomatic`。
- 同樣設定 `Images`、新增按鈕。`TControlBar` 支援多行停靠、自動換行、縮放手柄自訂繪製。
方案三:TControlBar 直接放 TButton/TBitBtn (輕量、無 ToolBar 開銷)
- `TControlBar` 直接容納 `TBitBtn` (支援圖示+文字)、`TSplitter` (分隔)。
- 每個按鈕 `DragKind = dkDock`、`DragMode = dmAutomatic`。
- 適合按鈕極少 (3-5 個)、不需 ToolBar 內建功能 (如下拉選單按鈕) 的簡易場景。
關鍵屬性對照表
| 屬性 | TCoolBar | TControlBar |
| 底層實現 | Win32 ReBar (Comctl32.dll 5.80+) | 純 VCL (TCustomControl 衍生) |
| 外觀 | 原生 XP/Vista/7/10 風格 (需 Manifest) | 可自訂繪製 (`OnPaint`)、主題一致性較好 |
| 停靠行為 | Band 為單位、支援斷行、最小化、捲軸 | 控件為單位、支援多行、浮動、自動隱藏 |
| 依賴 | 系統 Comctl32 版本敏感 | 無外部依賴、跨平台 (CLX/Kylix 時代) |
| 推薦場景 | 追求原生 Windows 外觀、複雜 Band 佈局 | 需高度自訂外觀、跨平台專案、避免 DLL 地獄 |
事件處理最佳實踐
- 按鈕 `OnClick`:單一職責,僅觸發命令/動作,業務邏輯委託給 Controller/Service 類。
- `TToolBar.OnResize` / `TCoolBar.OnBandChange`:動態調整按鈕寬度/可見性、儲存用戶佈局設定 (註冊表/INI/JSON)。
- `TControlBar.OnDockOver` / `OnUnDock`:控制哪些控件可停靠、禁止浮動、記錄停靠狀態。
結語
C++Builder 的 `TToolBar`/`TCoolBar`/`TControlBar` 提供了從簡單到專業的完整工具欄開發棧。理解「Band vs 控件」、「原生 ReBar vs 純 VCL」的架構差異,根據專案對外觀、相容性、擴充性的權衡選擇方案,即可打造媲美 Office/IE/VS 的專業級使用者介面。