IE 的工具列按鈕在滑鼠經過時會亮起鮮豔的「熱狀態」圖示,這需要工具列同時擁有兩組圖像列表:Normal (冷態) 與 Hot (熱態)。本文教你在 MFC 中完整實現 24 位真彩雙狀態工具列,核心在於 TB_SETIMAGELIST 與 TB_SETHOTIMAGELIST 訊息。

圖一:擁有冷/熱雙狀態真彩圖示的工具列
IDR_HOTBAR (按鈕 ID 對應命令)IDB_TOOLBAR_COLD (一般狀態)IDB_TOOLBAR_HOT (滑鼠經過狀態)// MainFrm.h
protected:
CToolBar m_hotToolBar; // 使用 CToolBar 即可,無需特殊類別
CImageList m_ilCold, m_ilHot; // 兩組圖像列表需持久化,不可為區域變數
OnCreate 中建立工具列並雙列表綁定// 建立工具列
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)) return -1;
// --- 核心:建立並設定冷態圖像列表 ---
CBitmap bmp;
bmp.LoadBitmap(IDB_TOOLBAR_COLD);
m_ilCold.Create(21, 20, ILC_COLORDDB | ILC_MASK, 13, 1); // ILC_COLORDDB: 裝置相關色彩 (通常 24/32 位)
m_ilCold.Add(&bmp, RGB(255, 0, 255)); // 洋紅色作為透明遮罩色
m_hotToolBar.SendMessage(TB_SETIMAGELIST, 0, (LPARAM)m_ilCold.m_hImageList);
bmp.Detach(); m_ilCold.Detach(); // 釋放 MFC 包裝,所有權轉給工具列
// --- 核心:建立並設定熱態圖像列表 ---
bmp.LoadBitmap(IDB_TOOLBAR_HOT);
m_ilHot.Create(21, 20, ILC_COLORDDB | ILC_MASK, 13, 1);
m_ilHot.Add(&bmp, RGB(255, 0, 255));
m_hotToolBar.SendMessage(TB_SETHOTIMAGELIST, 0, (LPARAM)m_ilHot.m_hImageList);
bmp.Detach(); m_ilHot.Detach();
// 訊息映射
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() {}
void CMainFrame::OnForward() {}
void CMainFrame::OnStop() {}
void CMainFrame::OnRefresh() {}
void CMainFrame::OnHome() {}
ILC_COLORDDB vs ILC_COLOR24: ILC_COLORDDB 會根據當前螢幕色深建立最佳色彩格式 (24/32 位),且相容 LR_LOADMAP3DCOLORS 類型載入;ILC_COLOR24 強制 24 位但可能在某些舊系統有相容性問題。CImageList::Add 會自動產生遮罩。CImageList 必須為類別成員,若為區域變數函數結束即解構,導致工具列圖像列表指標失效,顯示空白。這套方案無需第三方類別,純 MFC API 即可實現商業級真彩雙狀態工具列,穩定高效。