為什麼 Windows 檔案總管、IE 都能顯示絢麗的工具列圖示,但 MFC 預設專案卻只能顯示 16 色?根源在於 圖像列表 建立時的色彩深度預設值,以及 AfxLoadSysColorBitmap 內部假設 16 色。本文教你三行關鍵代碼,徹底解鎖 256 色 (8-bit) 甚至真彩色工具列。
工具列與列表視圖的圖像均儲存於 圖像列表 —— 一張由多個小圖拼成的長條位圖。MFC 建立工具列時,預設建立 16 色圖像列表。若你匯入 256 色位圖資源,顏色會被截斷慘變色。

圖一:工具列圖像列表結構示意 (7 個 20x20 圖標拼成 140x20 位圖)
CMainFrame::OnCreate)int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
// ... 標準建立框架、狀態列、視圖代碼 ...
// 1. 關鍵:用 ::LoadImage 載入位圖,支援 LR_LOADMAP3DCOLORS 映射系統 3D 面板色
HBITMAP hbm = (HBITMAP)::LoadImage(
AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDR_MAINFRAME), // 工具列位圖資源 ID
IMAGE_BITMAP, 0, 0,
LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS // 建立 DIB 區塊 + 映射 3D 色
);
CBitmap bm;
bm.Attach(hbm); // 包裝為 MFC 物件
// 2. 關鍵:建立 256 色 (ILC_COLOR8) 圖像列表
// ILC_COLOR8 = 8-bit 調色盤 (256色);ILC_COLOR24/32 可做真彩但不支援 LR_LOADMAP3DCOLORS
m_ilToolBar.Create(20, 20, ILC_COLOR8, 4, 4);
m_ilToolBar.Add(&bm, (CBitmap*)NULL); // 加入位圖,無需遮罩 (DIB 已含透明資訊)
// 3. 關鍵:將新圖像列表套用至工具列控制項
m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilToolBar);
return 0;
}
::LoadImage 的威力LR_CREATEDIBSECTION:建立裝置獨立位圖 (DIB),擁有完整色彩表控制權,不受螢幕色深限制。LR_LOADMAP3DCOLORS:自動將位圖中 RGB(192,192,192) (標準工具列灰底) 映射為當前系統 COLOR_3DFACE 顏色,完美適應深色/淺色主題切換。ILC_COLOR8 旗標的魔力此旗標指示 CImageList::Create 建立 8-bit 調色盤模式位圖 (256 色)。若需 24/32-bit 真彩色,可用 ILC_COLOR24 或 ILC_COLOR32,但 無法搭配 LR_LOADMAP3DCOLORS (因真彩色不需調色盤映射)。

圖二:成功顯示 256 色工具列,按鈕點擊彈出「關於」對話框
此技術同樣適用於 CListCtrl、CTreeCtrl、Rebar 等所有使用 CImageList 的控制項。只要在建立圖像列表時指定 ILC_COLOR8 (或更高),並用 LoadImage 正確載入位圖,即可擺脫 16 色枷鎖。