CListCtrlにイメージリストを設定して、各アイテムの各行にアイコンを設定するときに、先頭コラム(インデックス0)のLVITEM構造体のiImageに-1を設定してもなぜかイメージリストの0番目イメージが設定されてしまいます。デバッグしてみましたがiImageの値はちゃんと-1で処理が通っています。
お心当たりをお持ちの方がおられましたらご教授願えれば幸いです。
iImageにはイメージリストのインデックス番号とありますが、値がその
番号範囲外に有るときの動作は説明されていません。範囲外の値を指定
すれば表示されないというのはあなたの思い込みではあるいませんか?
それに -1 は I_IMAGECALLBACK なので LVN_GETDISPINFO メッセージが
親(呼び出し元)に送られ、親がインデックス番号を返す仕様です。
この通知メッセージに対するハンドラが作成されていない場合、フレーム
ワークが勝手に 0 を返す(デフォルト動作)のではないでしょうか。
対策としては透明なアイコン(または白色のアイコン)を作成して使用
するのはどうでしょうか。
(透明アイコンって作れたかな?)
どこかのサイトに書いてあったことをやってみたのですが仕様にはそぐわないようですね。白色のアイコンを作ってやることはできるのですが、テキストのフラグを立てて表示させると無駄なスペースができてしまいます。これをなくしたいのですが、その辺の設定ができないのではないかと思っているところです。
編集 削除追記です。
LVITEMのmaskにLVIF_IMAGEを設定せずにアイテムを追加しても、イメージリストがセットされていると最初のコラムのアイコンだけ描画されます。これが消せないんですよねw
自分の場合「アイコンを表示しないアイテム」が想定される場合は、
イメージリストの0番に何も表示しないイメージを設定しておいて、
0番を指定してます。この場合先頭に空きスペースが出てしまいます。
おそらくblueshield さんの発言の無駄なスペースは、このことで
しょう。
これをなくしたい場合はLVS_OWNERDRAWFIXED指定して、自分で書いちゃう
しかないと思います。
レポートスタイルでしかやったことがありませんけど。
どうもありがとうございます。
まぁオーナードローでもいいんですが、いまどき設定の柔軟性にかけるUIライブラリなど使いたくもないというのがあるので、できる範囲でやっておこうかなと思います。
ま、調べてなにかあったらやろうかと思います。
アイコンを使うかどうかはアイテム(行)毎の設定ではなく、コントロール
の設定になると思うので、所望の動作をさせるためにはオーナードローする
必要があると思います。
個人的にはアイコンの表示/非表示によって文字の開始位置が変わる(文字
の開始位置がそろわない)のはいやですね。
memset(&listitem, 0x00, sizeof(listitem));
listitem.mask = LVIF_PARAM|LVIF_TEXT;
listitem.iImage = 0;
listitem.iItem = 0;
listitem.iSubItem = 0;
SubItem = listCtrl.InsertItem(&listitem);
これで、きえるはずなんだけど、ちょっと確信はありませんが、
PS:すみませんレポートスタイルでの回答です