レポートビュー表示の左端に,チェックボックス風の状態イメージを表示させたい.
ヘルプには
状態イメージが指定されたときは、リストビューコントロールは状態イメージ用に各アイテムのアイコンの左側にスペースを確保します。
アプリケーションは アプリケーション定義のアイテムの状態を示すために、チェックボックスをオン、オフする様な状態イメージを使用できます。
ビット 12 から 15 が 0 以外のとき、その値は状態イメージの 1 から始まるインデックスを示します。
と書かれている.
ImageList は ListCtrl だけでなく,TreeCtrl でも利用可能である.
状態以外にもオーバーレイも使用できる.
1.各種イメージをリソースに用意する
a.スモールアイコン いくつでもOK
b.状態イメージ 15個まで
c.オーバーレイイメージ 4個まで
2.イメージを読み込み.透過色は何でもよい
COLORREF cr = ::GetSysColor(COLOR_WINDOW); // 背景色
m_imagelistIcon.Create(IDB_ICON, 16, 0, RGB(0, 0, 128));
m_imagelistIcon.SetBkColor(cr);
m_imagelistStat.Create(IDB_STAT, 16, 0, RGB(0, 0, 128));
m_imagelistStat.SetBkColor(cr);
m_imagelistOverlay.Create(IDB_OVERLAY, 16, 0, RGB(0, 0, 128));
3.CListCtrl もしくは、CTreeCtrl に登録
利用する時は,CImageList のインデックス番号を指定
m_listctrl.SetImageList(m_imagelistIcon, LVSIL_SMALL); // (a)
m_listctrl.SetImageList(m_imagelistStat, LVSIL_STATE); // (b)
m_treectrl.SetImageList(m_imagelistIcon, TVSIL_NORMAL); // (c)
m_treectrl.SetImageList(m_imagelistStat, TVSIL_STATE); // (d)
4.オーバーレイは,登録時の第2引数をインデックスとして使用
m_imagelistOverlay.SetOverlayImage(0, 1); // (e)
m_imagelistOverlay.SetOverlayImage(1, 2);
5.CListCtrl にアイテムを追加
LV_ITEM item;
item.iItem = 0;
item.iSubItem = 0;
item.mask = LVIF_IMAGE | LVIF_TEXT | LVIF_STATE;
item.iImage = 0; // (a) のインデックス
item.pszText = "foo";
item.stateMask = LVIS_STATEIMAGEMASK | LVIS_OVERLAYMASK;
item.state = INDEXTOSTATEIMAGEMASK(0 + 1) // (b) のインデックス + 1
| INDEXTOOVERLAYMASK(0); // (e) のインデックス
m_listctrl.InsertItem(&item);
6.個別に変更する場合
m_listctrl.SetItemState(nIndex, INDEXTOSTATEIMAGEMASK(1 + 1), LVIS_STATEIMAGEMASK);
m_listctrl.SetItemState(nIndex, INDEXTOOVERLAYMASK(1), LVIS_OVERLAYMASK);
7.CTreeCtrl にアイテムを追加
TV_INSERTSTRUCT tvis;
tvis.hParent = NULL;
tvis.hInsertAfter = TVI_SORT;
tvis.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_STATE;
tvis.item.iImage = 0; // (c) のインデックス
tvis.item.iSelectedImage = 1; // (c) のインデックス
tvis.item.pszText = "bar";
tvis.item.stateMask = TVIS_STATEIMAGEMASK | TVIS_OVERLAYMASK;
tvis.item.state = INDEXTOSTATEIMAGEMASK(0) // (d) のインデックス
| INDEXTOOVERLAYMASK(0); // (e) のインデックス
m_treectrl.InsertItem(&tvis);
8.個別に変更する場合
m_treectrl.SetItemState(hItem, INDEXTOSTATEIMAGEMASK(1), TVIS_STATEIMAGEMASK);
m_treectrl.SetItemState(hItem, INDEXTOOVERLAYMASK(1), TVIS_OVERLAYMASK);
参照
アイテム追加
イメージリストを破棄しない