Last Updated 2003/01/22
Programming Tips Visual C++ MFC CListView(CListCtrl)  索 引 
状態イメージの表示
2003/01/22

レポートビュー表示の左端に,チェックボックス風の状態イメージを表示させたい.
ヘルプには

状態イメージが指定されたときは、リストビューコントロールは状態イメージ用に各アイテムのアイコンの左側にスペースを確保します。
アプリケーションは アプリケーション定義のアイテムの状態を示すために、チェックボックスをオン、オフする様な状態イメージを使用できます。
ビット 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);


参照
アイテム追加
イメージリストを破棄しない
前後のTips
状態イメージの表示

DSS ProgrammingTipsCGI Ver2.02