リストで選択したアイテムのイメージ取得をするには

解決


マリリン  2004-07-17 06:30:38  No: 54023

表題の件について質問させていただきます。
下記に処理の流れを記述します。

環境: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の取得についてご存知の方、ご教授願います。


瀬戸っぷ  2004-07-17 09:44:16  No: 54024

>   sListItem.iItem = iPos;
>   m_cListCtrl.GetItem( &sListItem );

GetItem()を実行する前に、
sListItem.mask = LVIF_IMAGE;
を入れて下さい。
自動変数ですから、sListItemの各メンバには不定な値(ゴミ)が入っているはずです。
その為、maskメンバが不正になっていて希望する動作をしなかったのでしょう。

# こういう問題が嫌なので構造体はZeroMemory()で0クリアして、
# 構造体のサイズを指定するメンバがある場合はsizeof()で設定してから使うようにしています。


マリリン  2004-07-19 10:40:35  No: 54025

瀬戸っぷさん、ご回答ありがとうございました。

GetItem()を実行する前に、
sListItem.mask = LVIF_IMAGE;
を入れましたが動作しませんでした。

しかし、ご指摘の通り、構造体をZeroMemory()してから
実行したところ正常な動作が行えました。

返事が遅くなりまして申し訳ございませんでした。
大変参考になりました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加