MFC 原生 CToolBar 操作繁瑣:建立、載入位圖、設定按鈕資訊、尺寸調整... 步驟多、易出錯。本文提供一個輕量級封裝類 CToolBarEx,將常用操作封裝為直觀的成員函數,讓工具列建立變得像積木一樣簡單。
// MainFrm.h
CToolBarEx m_tbex;
// MainFrm.cpp OnCreate
m_tbex.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
m_tbex.SetButtonNumber(5); // 含分隔條共 5 個位置
// 加入圖示 (支援 HICON 直接加入,自動建立圖像列表)
m_tbex.AddIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME)); // 索引 0
m_tbex.AddIcon(AfxGetApp()->LoadIcon(IDR_TBTYPE)); // 索引 1
m_tbex.AddIcon(AfxGetApp()->LoadIcon(IDI_SWIRE)); // 索引 2
m_tbex.AddIcon(AfxGetApp()->LoadIcon(IDI_ICON1)); // 索引 3
// 設定按鈕:位置、命令ID、圖示索引、文字
m_tbex.SetButton(0, ID_APP_ABOUT, 0, _T("員工"));
m_tbex.SetButton(1, ID_APP_EXIT, 1, _T("進料"));
m_tbex.AddSeparator(2); // 位置 2 為分隔條
m_tbex.SetButton(3, ID_APP_ABOUT, 2, _T("Swire"));
m_tbex.SetButton(4, ID_APP_ABOUT, 3, _T("Coca"));
// 一鍵套用預設尺寸 (或自訂 SetSize(50,40))
m_tbex.SetDefaultSize();
// 完成!漂亮工具列已顯示
CToolBarEx : public CToolBarclass CToolBarEx : public CToolBar
{
public:
CToolBarEx();
virtual ~CToolBarEx();
// 圖示/位圖管理
void SetImageSize(int cx, int cy); // 設定單個圖示尺寸
void AddBitmap(CBitmap* pbmImage, COLORREF crMask); // 加入位圖+遮罩色
void AddBitmap(CBitmap* pbmImage, CBitmap* pbmMask); // 加入位圖+遮罩位圖
void AddIcon(HICON hIcon); // 核心:直接加入 HICON (最常用)
// 按鈕配置
void SetButtonNumber(int nCount); // 設定總按鈕數 (含分隔條)
void SetButton(int nIndex, int nID, int nImageIndex, LPCTSTR pszText); // 完整設定
void SetButton(int nIndex, int nID, int nImageIndex); // 僅圖示無文字
void AddSeparator(int nIndex); // 插入分隔條
// 尺寸設定
void SetSize(int cx = 50, int cy = 40); // 設定按鈕尺寸 (含邊框)
void SetDefaultSize(); // 根據第一個按鈕實際大小自動計算
// 內部圖像列表 (公開供進階操作)
CImageList m_img;
CSize m_sizeImage; // 單個圖示尺寸
protected:
void SetImage(); // 內部:將 m_img 套用至 ToolBarCtrl
DECLARE_MESSAGE_MAP()
};
CToolBarEx::CToolBarEx()
{
m_sizeImage = CSize(20, 20); // 預設圖示 20x20
m_img.Create(m_sizeImage.cx - 1, m_sizeImage.cy - 1, ILC_COLOR8 | ILC_MASK, 1, 1);
}
void CToolBarEx::AddIcon(HICON hIcon)
{
m_img.Add(hIcon); // CImageList::Add(HICON) 自動拆解圖示與遮罩
SetImage(); // 即時同步至控制項
}
void CToolBarEx::SetButton(int nIndex, int nID, int nImage, LPCTSTR pszText)
{
SetButtonInfo(nIndex, nID, TBSTYLE_BUTTON, nImage);
if (pszText) SetButtonText(nIndex, pszText);
}
void CToolBarEx::SetDefaultSize()
{
CRect rc; GetItemRect(0, &rc); // 取得第一個按鈕實際矩形
SetSizes(rc.Size(), m_sizeImage); // 按鈕尺寸=實際大小, 圖示尺寸=預設
}
void CToolBarEx::SetImage() { GetToolBarCtrl().SetImageList(&m_img); }
// ... 其他函數實現類似,均為對 MFC 原生 API 的薄封裝 ...
AddIcon, SetButton, AddSeparator 直觀對應操作意圖。m_img, m_sizeImage 供進階需求直接操作。CToolBar,所有原生功能 (浮動、停靠、工具提示) 完全保留。快速原型開發、工具列配置頻繁變更的專案、團隊統一工具列建立規範。若需極致客製化 (如自繪、複雜佈局),仍建議直接操作原生 API。