CImageList 管理同尺寸圖像集合 (圖示/位圖),支援透明遮罩、拖曳、索引存取。索引以 0 為基底。常搭配 CListCtrl、CTreeCtrl、CTabCtrl 使用,提供視覺化介面元素。
m_hImageList:底層映像列表控制代碼// 1. 空白建立,指定尺寸、旗標、初始/成長數量
BOOL Create(int cx, int cy, UINT nFlags, int nInitial, int nGrow);
// 2. 從資源位圖建立
BOOL Create(UINT nBitmapID, int cx, int nGrow, COLORREF crMask);
BOOL Create(LPCTSTR lpszBitmapID, int cx, int nGrow, COLORREF crMask);
// 3. 合併兩個現有 ImageList
BOOL Create(CImageList& imagelist1, int nImage1,
CImageList& imagelist2, int nImage2, int dx, int dy);
參數說明:
cx, cy:單一圖像寬/高 (像素)nFlags:ILC_COLOR、ILC_COLOR32、ILC_MASK 等組合nInitial:預分配圖像數nGrow:擴充步長crMask:透明遮罩色| 分類 | 方法 | 用途 |
|---|---|---|
| 屬性 | GetSafeHandle() | 取得底層 HIMAGELIST |
| GetImageCount() | 取得圖像總數 | |
| SetBkColor()/GetBkColor() | 設定/取得背景色 | |
| 操作 | Attach()/Detach() | 綁定/解除綁定控制代碼 |
| DeleteImageList() | 銷毀映像列表 | |
| Add() | 新增圖像 (支援位圖/圖示/圖示陣列) | |
| Remove() | 移除指定索引圖像 | |
| Replace() | 替換指定索引圖像 |
CImageList m_imgLarge, m_imgSmall;
// 大圖示 (32x32)
m_imgLarge.Create(32, 32, ILC_COLOR32 | ILC_MASK, 2, 2);
m_imgLarge.Add(AfxGetApp()->LoadIcon(IDI_ICON_SEL));
m_imgLarge.Add(AfxGetApp()->LoadIcon(IDI_ICON_UNSEL));
// 小圖示 (16x16)
m_imgSmall.Create(16, 16, ILC_COLOR32 | ILC_MASK, 2, 2);
m_imgSmall.Add(AfxGetApp()->LoadIcon(IDI_ICON_SEL));
m_imgSmall.Add(AfxGetApp()->LoadIcon(IDI_ICON_UNSEL));
// 關聯
m_listCtrl.SetImageList(&m_imgLarge, LVSIL_NORMAL); // 大圖示
m_listCtrl.SetImageList(&m_imgSmall, LVSIL_SMALL); // 小圖示
m_listCtrl.SetImageList(&m_imgState, LVSIL_STATE); // 狀態圖示
列表類型常數:LVSIL_NORMAL, LVSIL_SMALL, LVSIL_STATE
CImageList m_imgTree;
m_imgTree.Create(16, 16, ILC_COLOR32 | ILC_MASK, 2, 2);
m_imgTree.Add(AfxGetApp()->LoadIcon(IDI_FOLDER_OPEN));
m_imgTree.Add(AfxGetApp()->LoadIcon(IDI_FOLDER_CLOSED));
m_treeCtrl.SetImageList(&m_imgTree, TVSIL_NORMAL); // 標準圖示 (含選中/未選中)
// 節點項目設定
TVITEM item;
item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
item.iImage = 0; // 未選中索引
item.iSelectedImage = 1; // 選中索引
樹狀類型常數:TVSIL_NORMAL, TVSIL_STATE
CImageList m_imgTab;
m_imgTab.Create(16, 16, ILC_COLOR32 | ILC_MASK, 3, 1);
m_imgTab.Add(AfxGetApp()->LoadIcon(IDI_TAB1));
m_imgTab.Add(AfxGetApp()->LoadIcon(IDI_TAB2));
m_imgTab.Add(AfxGetApp()->LoadIcon(IDI_TAB3));
m_tabCtrl.SetImageList(&m_imgTab);
// 頁面設定圖示索引
TCITEM tie;
tie.mask = TCIF_IMAGE;
tie.iImage = 0; // 第一頁用索引 0
m_tabCtrl.SetItem(0, &tie);
LoadIcon 載入的圖示需 DestroyIcon,但 CImageList::Add 會複製,原控制代碼可立即釋放CImageList 對應不同縮放比例 (100%, 125%, 150%)Replace 可在執行期換裝圖示,無需重建控件nGrow 設合理值避免頻繁重新分配crMask 常用 RGB(255,0,255) (洋紅) 或 CLR_NONE 配合 Alpha 通道Create 旗標是否含 ILC_MASK、SetImageList 索引類型是否正確Add 回傳實際索引,勿假設連續CImageList 成員會自動 DeleteImageList,動態配置需手動釋放