MFC 預設工具列與列表視圖的圖像清單(Image List)僅支援 16 色,導致開發者無法直接使用資源中建立的 256 色圖示或位圖。本文詳細說明如何透過 LoadImage 與 ILC_COLOR8 旗標,輕鬆實現工具列的 256 色真彩顯示,同樣技巧亦適用於 Rebar、列表視圖等使用圖像清單的控件。
工具列按鈕圖像儲存於圖像清單,本質是一張長條位圖(如 7 個 20×20 圖示組成 140×20 位圖)。MFC 內部載入工具列位圖時呼叫 AfxLoadSysColorBitmap,預設僅建立 16 色裝置相關位圖(DDB),且建立圖像清單時預設色深為 16 色(ILC_COLOR4)。
在 CMainFrame::OnCreate 中替換預設載入流程:
// 1. 使用 LoadImage 載入位圖,啟用 3D 色彩映射與 DIB 建立
HBITMAP hbm = (HBITMAP)::LoadImage(
AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDR_MAINFRAME),
IMAGE_BITMAP, 0, 0,
LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS
);
CBitmap bm; bm.Attach(hbm);
// 2. 建立 256 色圖像清單(ILC_COLOR8 = 8-bit 調色盤,即 256 色)
m_ilToolBar.Create(20, 20, ILC_COLOR8, 4, 4);
m_ilToolBar.Add(&bm, (CBitmap*)NULL);
// 3. 將新圖像清單套用至工具列控件
m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilToolBar);
LR_CREATEDIBSECTION:建立裝置獨立位圖(DIB Section),支援高色深。LR_LOADMAP3DCOLORS:將位圖中 RGB(192,192,192) 背景色自動映射為系統 3D 面板色(COLOR_3DFACE),解決不同色彩方案下的背景不匹配問題。ILC_COLOR8:指定 8-bit 調色盤模式(256 色);若需 24-bit 真彩可用 ILC_COLOR24,但須注意 LR_LOADMAP3DCOLORS 僅適用於調色盤位圖。SetImageList 替換工具列內建圖像清單,否則變更不生效。同樣技術可直接用於 CListView、CListCtrl、Rebar 等所有基於 CImageList 的控件,只需在建立圖像清單時指定 ILC_COLOR8 或 ILC_COLOR24 並配合 LoadImage 載入高色深位圖即可。
範例程式 TBColor 完整演示了工具列 256 色圖示的載入與顯示,編譯執行即可見到色彩豐富的工具列按鈕。