許多開發者困擾:VC 載入 256 色或真彩色圖示 (.ico) 後顏色慘變、邊緣鋸齒。網上多教「做成一張大工具列位圖」,但找順手的排圖工具很麻煩。本文揭露最直接、標準的單一圖示檔載入法:CImageList::Create 關鍵參數 TRUE | ILC_COLOR8 + ::LoadImage 載入圖示資源,輕鬆實現無失真高彩度圖示。

範例程式執行效果:工具列圖示色彩飽滿、邊緣平滑無鋸齒
CImageList 成員// MainFrm.h protected: CImageList m_ilTB;
OnCreate 中建立圖像列表 —— 關鍵參數解析// 建立 32x32、支援透明、256 色調色盤的圖像列表 m_ilTB.Create(32, 32, TRUE | ILC_COLOR8, 4, 0);
| 參數 | 值 | 含義 |
|---|---|---|
| cx, cy | 32, 32 | 單個圖示寬高 (像素) |
| flags | TRUE | ILC_COLOR8 | TRUE=支援透明 (按位或);ILC_COLOR8=8-bit 調色盤 (256色)。這是關鍵! 預設無此旗標則為 16 色。 |
| nInitial | 4 | 初始預分配圖示數量 |
| nGrow | 0 | 擴充步長 (0 表不自動擴充,大量動態增刪時建議設 >0 避免頻繁記憶體分配) |
HICON hIcon = (HICON)::LoadImage(
::AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDI_ICON1), // 圖示資源 ID
IMAGE_ICON, 32, 32, 0 // 類型、寬、高、旗標(0=預設載入)
);
m_ilTB.Add(hIcon); // 直接加入 HICON,CImageList 內部處理圖示拆解與遮罩
// 重複上述載入加入其他圖示...
m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilTB);
.ico 檔,美工輸出標準格式,無需排版拼圖。.ico 內可含 16x16, 32x32, 48x48 多尺寸,LoadImage 指定尺寸自動選取最佳者。CImageList::Add(HICON) 自動正確處理透明邊緣,無鋸齒。ILC_COLOR8 改為 ILC_COLOR24 或 ILC_COLOR32 即可 (需搭配 LR_CREATEDIBSECTION 載入)。CImageList 必須為類別成員變數,不可為區域變數。SetSizes) 必須與 CImageList::Create 指定尺寸一致。掌握此法,圖示失真問題徹底成為歷史,你的工具列將擁有媲美商業軟體的視覺質感。