MFC 預設工具列位圖僅支援 16 色(4 位元),導致圖示色彩斑駁。本文示範如何利用 ::LoadImage 的 LR_LOADMAP3DCOLORS 與 LR_CREATEDIBSECTION 旗標,配合 CImageList::Create(..., ILC_COLOR8, ...) 實現工具列 256 色(8 位元調色盤)甚至真彩色顯示。
::LoadImage 載入位圖資源,啟用 3D 面板色對映與 DIB 區段:HBITMAP hbm = (HBITMAP)::LoadImage(
AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDR_MAINFRAME),
IMAGE_BITMAP, 0, 0,
LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS
);
LR_LOADMAP3DCOLORS:將位圖中 RGB(192,192,192) (標準工具列灰色背景)自動對映為系統當前的 COLOR_3DFACE 系統色,解決不同主題下背景色不匹配問題。LR_CREATEDIBSECTION:建立 DIB Section,使位圖像素資料可直接被應用程式存取,也是後續建立高色深影像清單的前提。CBitmap 並建立 256 色影像清單:CBitmap bm;
bm.Attach(hbm); // 接管 HBITMAP 所有權
// 關鍵:ILC_COLOR8 = 8 位元調色盤 (256 色);若需 24/32 位真彩色請用 ILC_COLOR24/ILC_COLOR32
m_ilToolBar.Create(20, 20, ILC_COLOR8, 4, 4); // 圖示 20x20,初始 4 個,成長 4 個
m_ilToolBar.Add(&bm, (CBitmap*)NULL); // 無遮罩位圖,以品紅色(RGB 255,0,255)為透明色
m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilToolBar);
CMainFrame::OnCreate 範例int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
// 1. 建立並載入工具列資源 (不直接 LoadToolBar,改手動控制)
if (!m_wndToolBar.Create(this) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { // LoadToolBar 內部會建立預設 16 色清單
return -1;
}
// 2. 以高色深重新載入位圖
HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_BITMAP, 0, 0,
LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS);
if (!hbm) return -1;
CBitmap bm; bm.Attach(hbm);
// 3. 重建影像清單 (256 色)
m_ilToolBar.Create(20, 20, ILC_COLOR8, 4, 4);
m_ilToolBar.Add(&bm, NULL);
// 4. 替換工具列控制項的影像清單
m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilToolBar);
// ... 狀態列、檢視視窗建立 ...
return 0;
}
若專案需求極高色彩保真度(如圖示含漸層、陰影),可改用 ILC_COLOR24 或 ILC_COLOR32,但 LR_LOADMAP3DCOLORS **僅支援調色盤位圖**,真彩色模式下需自行處理背景色透明化(通常在美術資源階段預先去背,或程式碼中 ImageList_AddMasked 指定透明色)。
此技術核心在於 CImageList 的建立參數,故同樣適用於 CListCtrl、CTreeCtrl、CReBarCtrl 等所有使用影像清單的控制項。