IE 風格的彩色工具列需要分離「一般狀態」與「滑鼠熱追蹤狀態」兩組圖片。本文示範使用 CImageList 建立雙影像清單,透過 TB_SETIMAGELIST 與 TB_SETHOTIMAGELIST 訊息實現 24 位色工具列。
// MainFrm.h
CToolBar m_hotToolBar;
// 建立工具列(扁平風格 + 列表模式)
if (!m_hotToolBar.CreateEx(this, TBSTYLE_FLAT | TBSTYLE_LIST,
WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_hotToolBar.LoadToolBar(IDR_HOTBAR)) {
TRACE0("Failed to create toolbar\n");
return -1;
}
// 一般狀態影像清單 (IDB_TOOLBAR_COLD)
CImageList imageList; CBitmap bitmap;
bitmap.LoadBitmap(IDB_TOOLBAR_COLD);
imageList.Create(21, 20, ILC_COLORDDB | ILC_MASK, 13, 1);
imageList.Add(&bitmap, RGB(255,0,255)); // 品紅色作為透明色
m_hotToolBar.SendMessage(TB_SETIMAGELIST, 0, (LPARAM)imageList.m_hImageList);
imageList.Detach(); bitmap.Detach();
// 熱追蹤狀態影像清單 (IDB_TOOLBAR_HOT)
bitmap.LoadBitmap(IDB_TOOLBAR_HOT);
imageList.Create(21, 20, ILC_COLORDDB | ILC_MASK, 13, 1);
imageList.Add(&bitmap, RGB(255,0,255));
m_hotToolBar.SendMessage(TB_SETHOTIMAGELIST, 0, (LPARAM)imageList.m_hImageList);
imageList.Detach(); bitmap.Detach();
// MainFrm.h
afx_msg void OnBack(); afx_msg void OnForward();
afx_msg void OnStop(); afx_msg void OnRefresh();
afx_msg void OnHome();
// MainFrm.cpp 訊息對應
ON_COMMAND(ID_BACK, OnBack)
ON_COMMAND(ID_FORWARD, OnForward)
ON_COMMAND(ID_STOP, OnStop)
ON_COMMAND(ID_REFRESH, OnRefresh)
ON_COMMAND(ID_HOME, OnHome)
// 空實作(實際專案填入導航邏輯)
void CMainFrame::OnBack() {} // 等五個函數
| 技術點 | 說明 |
|---|---|
TBSTYLE_FLAT | TBSTYLE_LIST | 扁平風格 + 圖示與文字並列(IE 風格) |
ILC_COLORDDB | ILC_MASK | 裝置相依色彩 + 遮罩(支援透明色) |
RGB(255,0,255) | 品紅色作為透明色慣例(不常用於圖片內容) |
TB_SETIMAGELIST | 設定一般狀態影像清單 |
TB_SETHOTIMAGELIST | 設定熱追蹤狀態影像清單(滑鼠懸停時切換) |
Detach() | 釋放 MFC 物件對底層 GDI 物件的擁有權,避免重複釋放 |
IDR_HOTBAR:定義 5 個按鈕 (Back, Forward, Stop, Refresh, Home)IDB_TOOLBAR_COLD:一般狀態 5 張 21×20 圖示水平拼接IDB_TOOLBAR_HOT:熱追蹤狀態 5 張同尺寸圖示(通常亮度較高/色調不同)雙 CImageList + TB_SETIMAGELIST/TB_SETHOTIMAGELIST 是實現 24 位色熱追蹤工具列的標準 MFC 做法。程式碼簡潔、無第三方相依、完整相容標準工具列架構。適合需求 IE 風格彩色工具列的專案直接採用。