MFC 原生 CToolBar 操作繁瑣(建立、設定按鈕、載入位圖、設定尺寸分散多處)。本文封裝常用功能為 CToolBarEx 繼承類別,提供鏈式呼叫風格 API,大幅簡化工具列建立流程。
// CMainFrame 成員
CToolBarEx tbex;
// OnCreate 中
tbex.CreateEx(this, TBSTYLE_FLAT, WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC);
tbex.SetButtonNumber(5); // 含分隔器
tbex.AddIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME));
tbex.AddIcon(AfxGetApp()->LoadIcon(IDR_TBTYPE));
tbex.AddIcon(AfxGetApp()->LoadIcon(IDI_SWIRE));
tbex.AddIcon(AfxGetApp()->LoadIcon(IDI_ICON1));
tbex.SetButton(0, ID_APP_ABOUT, 0, "員工");
tbex.SetButton(1, ID_APP_EXIT, 1, "進料");
tbex.AddSeparator(2);
tbex.SetButton(3, ID_APP_ABOUT, 2, "Swire");
tbex.SetButton(4, ID_APP_ABOUT, 3, "Coca");
tbex.SetSize(); // 或 SetDefaultSize()
class CToolBarEx : public CToolBar {
public:
CImageList img; // 圖片清單
CSize sizeImage; // 圖片尺寸
// 圖片管理
void SetImageSize(int cx, int cy);
void AddBitmap(CBitmap* pbmImage, COLORREF crMask);
void AddBitmap(CBitmap* pbmImage, CBitmap* pbmMask);
void AddIcon(HICON hIcon); // 自動加入圖片清單並更新工具列
// 按鈕設定
void SetButtonNumber(int n); // 設定按鈕總數(含分隔器)
void SetButton(int nBtn, int nID, int nImg, LPCTSTR lpText); // 含文字
void SetButton(int nBtn, int nID, int nImg); // 無文字
void AddSeparator(int nBtn); // 指定位置加入分隔器
// 尺寸設定
void SetSize(int cx=50, int cy=40); // 設定按鈕大小
void SetDefaultSize(); // 依現有按鈕自動計算
// 內部更新
void SetImage(); // 將 img 套用至工具列控制項
};
CToolBarEx::CToolBarEx() {
sizeImage.cx = sizeImage.cy = 20; // 預設 20×20
img.Create(sizeImage.cx-1, sizeImage.cy-1, ILC_COLOR8|ILC_MASK, 1, 1);
}
void CToolBarEx::AddIcon(HICON hIcon) {
img.Add(hIcon);
SetImage(); // 即時更新
}
void CToolBarEx::SetButton(int nButton, int nID, int nImage, LPCTSTR lpText) {
SetButtonInfo(nButton, nID, TBSTYLE_BUTTON, nImage);
SetButtonText(nButton, lpText);
}
void CToolBarEx::SetSize(int nWidth, int nHeight) {
CSize cs(nWidth, nHeight);
SetSizes(cs, sizeImage); // CToolBar::SetSizes(按鈕大小, 圖片大小)
}
void CToolBarEx::SetDefaultSize() {
CRect rect; GetItemRect(0, &rect);
SetSizes(rect.Size(), sizeImage);
}
| 優點 | 缺點/限制 |
|---|---|
| API 直覺、鏈式操作、程式碼集中 | 圖片清單建立時機固定(建構子),動態改變圖片尺寸需重建 |
| 整合 AddIcon/SetButton/SetSize 常用流程 | 僅封裝基礎功能,進階功能(如下拉按鈕、自繪)仍需直接操作底層 |
| 支援 HICON 直接加入,免轉位圖 | 錯誤處理簡單,資源載入失敗無回傳值 |
LoadToolBarEx(UINT nIDResource) 一鍵從資源載入CBitmap 直接加入(目前僅 HICON)EnableButton()、CheckButton()、HideButton()GetButtonRect()、HitTest() 等常用查詢CToolBarEx 以約 80 行程式碼封裝了工具列 90% 的常用建立流程,適合快速原型開發與中小型專案。原始碼開放,建議依專案需求擴充為完整工具列管理類別。