CListCtrlでCImageListを使用してアイテムにアイコンを表示しています。
(レポート形式でアイコンは16x16のみ使用です)
このアイコンを任意のタイミング(ボタンを押された時など)で指定の
行だけ変更したいのですが,どのようにすれば良いでしょうか?
ヘルプにもテキストを変更する関数はあってもイメージを変更するものは
見あたりません。
「コールバック項目」という機能を使用するのかと思いましたが,これの
使用方法はヘルプには載っていません。
もし,できないのであれば
「変更する行を削除」→「アイコンを変更して追加」
と,ならざるをえないのでしょうか?
もし,アイコンの変更の仕方をご存じの方がおられたらご教授願います。
よろしくお願いします。
CListCtrl::SetItemを使用すれば良いのでは・・
実は,CListCtrl::SetItemは使用したのですが,アイコンは変更できませんでした。
SetItem実施後にUpdateが必要かとも思い行ったのですが,やはり結果はダメでした。
SetItemを使用する上で注意点などがあるのでしょうか?
ご存じの方がいらしたらよろしくお願いします。
試しましたが出来ましたよ・・
・LVIF_IMAGEをマスクに指定していますか?
・nImageにイメージのインデックスを指定していますか?
できました!!
「nImage」とあったので,ひょっとしてと思いSetItemの各パラメータを引数で
実行するタイプのものを使用したところアイコンの変更ができました。
『不良PG』様,本当にありがとうございました。
ただ,引数に LVITEM構造体を指定するタイプのものは相変わらずできません。
たとえば,アイテムインデックス=5のアイコンをイメージ0→1にする処理で
以下のようにしたのですが。。。
LVITEM listitem;
listitem.iItem = 5;
m_listView.GetItem(&listitem); // 念のため現情報を取得
listitem.mask = LVIF_TEXT | LVIF_IMAGE;
listitem.iSubItem = 0;
listitem.iImage = 1; // イメージ変更
m_listView.SetItem(&listitem);
これではできませんでした。
できたら原因を知りたいのですがご教授願えないでしょうか。
よろしくお願いします。
イメージを変更したいだけならば
LVITEM listitem;
listitem.iItem = 5;
listitem.mask = LVIF_IMAGE;
listitem.iSubItem = 0;
listitem.iImage = 1; // イメージ変更
m_listView.SetItem(&listitem);
でOKです
maskメンバで指定された内容のみ設定されるので余計な情報は、要りません
(リストコントロール自体が保持している為)
>できたら原因を知りたいのですがご教授願えないでしょうか。
1.GetItemを呼ぶときにmaskメンバが指定してないために
GetItem関数が失敗(例外を起こす)してpszTextにゴミ(初期化してない値)が入る。
2.SetItem関数でmaskメンバにLVIF_TEXTを指定しているのにpszTextにゴミが入っているから
関数が失敗する。
結局、二つの関数が共に失敗して動作しません。
あぁ。なるほど。
maskの使用方法がまずかった訳ですね。
大変勉強になりました。
『不良PG』様,色々と教えていただきありがとうございました。
お手数をかけて申し訳ありませんでした。