表題の件について質問させていただきます。
下記に処理の流れを記述します。
環境:Microsoft VisualC++ 6.0(MFC6.0)
①:メンバ変数作成
CImageList m_ImageList;
CListCtrl m_ListCtrl;
②:リソースのBitmapに表示したいアイコンを用意(IDB_BITMAP)
表示したいアイコンが2種類あるため、2個登録しています。
③:イメージリストの設定
m_ImageList.Create( IDB_BITMAP, 11, 1, RGB(128,0,128) );
m_ListCtrl.SetImageList( &m_ImageList, LVSIL_SMALL );
④:リストにアイテム挿入
LVITEM sListItem;
sListItem.mask = LVIF_IMAGE | LVIF_TEXT;
sListItem.iItem = INT_MAX;
sListItem.iSubItem = 0;
sListItem.pszText = _T("テスト");
if ( 条件 )
{
sListItem.iImage = 1; // 2番目のビットマップ
}
else
{
sListItem.iImage = 0; // 1番目のビットマップ
}
int iIndex = m_ListCtrl.InsertItem( &sListItem );
m_ListCtrl.SetItemText( iIndex, 1, _T("テスト2") );
m_ListCtrl.SetItemText( iIndex, 2, _T("テスト3") );
⑤:リストで選択されたアイテムのイメージ(iImage)取得
LV_ITEM sListItem;
int iPos = m_ListCtrl.GetNextItem( -1, LVNI_SELECTED );
sListItem.iItem = iPos;
m_cListCtrl.GetItem( &sListItem );
int iImage = sListItem.iImage;
④までは問題なく処理されリストビューに目的のアイテムが挿入されます。
しかし、⑤で選択されたアイテムのiImageの値(0or1)を取得したいのですが、
うまく動作せずに困っております。
iImageの取得についてご存知の方、ご教授願います。
> sListItem.iItem = iPos;
> m_cListCtrl.GetItem( &sListItem );
GetItem()を実行する前に、
sListItem.mask = LVIF_IMAGE;
を入れて下さい。
自動変数ですから、sListItemの各メンバには不定な値(ゴミ)が入っているはずです。
その為、maskメンバが不正になっていて希望する動作をしなかったのでしょう。
# こういう問題が嫌なので構造体はZeroMemory()で0クリアして、
# 構造体のサイズを指定するメンバがある場合はsizeof()で設定してから使うようにしています。
瀬戸っぷさん、ご回答ありがとうございました。
GetItem()を実行する前に、
sListItem.mask = LVIF_IMAGE;
を入れましたが動作しませんでした。
しかし、ご指摘の通り、構造体をZeroMemory()してから
実行したところ正常な動作が行えました。
返事が遅くなりまして申し訳ございませんでした。
大変参考になりました。
ツイート | ![]() |