首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

MFC CImageList 圖像列表控件全解析:建立、屬性與 ListCtrl/TreeCtrl/TabCtrl 整合實戰

     編輯:關於VC++

CImageList 核心概念

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()替換指定索引圖像

三、與常見控件整合實戰

1. CListCtrl (清單控件)

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

2. CTreeCtrl (樹狀控件)

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

3. CTabCtrl (索引標籤控件)

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 會複製,原控制代碼可立即釋放
  • 高 DPI 支援:建立多個 CImageList 對應不同縮放比例 (100%, 125%, 150%)
  • 動態更新:Replace 可在執行期換裝圖示,無需重建控件
  • 記憶體優化:nGrow 設合理值避免頻繁重新分配
  • 透明色處理:crMask 常用 RGB(255,0,255) (洋紅) 或 CLR_NONE 配合 Alpha 通道

五、常見問題排查

  1. 圖示不顯示:檢查 Create 旗標是否含 ILC_MASK、SetImageList 索引類型是否正確
  2. 索引錯位:Add 回傳實際索引,勿假設連續
  3. 記憶體洩漏:視圖銷毀時 CImageList 成員會自動 DeleteImageList,動態配置需手動釋放
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved