在 VC 開發中,工具列圖示若超過 256 色直接載入常會失真。許多開發者嘗試載入高色彩位圖資源,卻苦於缺乏合適的繪圖工具製作此類位圖。本文揭示一種更直接的方法:直接載入獨立圖示資源(.ico),透過 CImageList 正確設定色深與透明屬性,實現 256 色以上圖示完美顯示,無需製作特殊位圖條。
CMainFrame 類別宣告 CImageList m_ilTB 成員變數OnCreate() 中建立 Image List 並加入圖示資源m_ilTB.Create(32, 32, TRUE | ILC_COLOR8, 4, 0);
參數詳解:
TRUE:啟用透明繪製(使用遮罩)ILC_COLOR8:指定 8 位元色彩(256 色調色盤)關鍵洞察:
ILC_COLOR8並非限制圖示只能 256 色,而是指定 Image List 內部使用 8 位元調色盤模式。配合LoadImage()載入真彩色圖示資源,系統會自動執行色彩量化與抖動處理,呈現近似真彩色效果。
HICON hIcon = NULL;
hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 32, 32, 0);
m_ilTB.Add(hIcon);
LoadImage() 直接從資源載入圖示控制代碼,支援任意色深的 .ico 檔IMAGE_ICON 指定載入類型為圖示CImageList::Create() 設定一致Add() 將圖示加入映像清單,自動處理透明遮罩int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// 建立工具列映像清單
m_ilTB.Create(32, 32, TRUE | ILC_COLOR8, 4, 0);
// 載入多個圖示資源
HICON hIcon;
hIcon = (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 32, 32, 0);
m_ilTB.Add(hIcon);
hIcon = (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON2), IMAGE_ICON, 32, 32, 0);
m_ilTB.Add(hIcon);
// ... 繼續加入其他圖示
// 關聯工具列
m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilTB);
return 0;
}
TRUE 旗標確保圖示透明區域正確顯示Create() 的 TRUE 旗標與圖示資源是否包含透明遮罩ILC_COLOR16 (16位元) 或 ILC_COLOR24 (24位元) 旗標(需系統版本支援)LoadImage() 請求尺寸與 CImageList::Create() 設定一致