樹狀控制項的狀態圖示(State Image)顯示在項目圖示左側,常用於核取方塊、選項按鈕、自訂狀態標記。本文說明如何建立包含多個狀態圖示的影像清單、關聯至樹狀控制項、並在插入/更新項目時指定狀態索引(需使用 `INDEXTOSTATEIMAGEMASK` 宏)。
class CTreeCtrlX : public CTreeCtrl {
public:
CImageList m_imgState; // 狀態圖示清單
// ...
};
在 `OnInitDialog` 或 `OnInitialUpdate` 中:
// 建立影像清單:資源 ID、單張寬度、成長步長、透明色
m_imgState.Create(IDB_STATE, 13, 1, RGB(255,255,255));
// 關聯至樹狀控制項,TVSIL_STATE 表示狀態圖示清單
SetImageList(&m_imgState, TVSIL_STATE);
狀態圖示索引從 1 開始(0 表示無狀態圖示),必須用 `INDEXTOSTATEIMAGEMASK(n)` 宏轉換為狀態遮罩值。
// 方法一:插入時指定 (TV_INSERTSTRUCT)
TV_INSERTSTRUCT tv = {0};
tv.hParent = TVI_ROOT;
tv.hInsertAfter = TVI_LAST;
tv.item.mask = TVIF_TEXT | TVIF_STATE;
tv.item.stateMask = TVIS_STATEIMAGEMASK;
tv.item.state = INDEXTOSTATEIMAGEMASK(1); // 使用第 1 個狀態圖示
tv.item.pszText = _T("項目文字");
HTREEITEM hItem = InsertItem(&tv);
// 方法二:事後設定
SetItemState(hItem, INDEXTOSTATEIMAGEMASK(2), TVIS_STATEIMAGEMASK); // 切換為第 2 個