リストビューにアイコンを付ける~他タイプのリストビューについて †

[edit]
リストビューにアイコンをつける †

特定フォルダ内のファイルリストをリストビューに表示しアイコンをつけてみます

[edit]
準備 †
iml.sbp

↑を前回までのプロジェクトに追加

[edit]
イメージリスト †

イメージリストというのはコモンコントロールの一種で同サイズのイメージをインデックスで管理できるようにしたものです
コモンコントロールでアイコンを使う場合はほぼ例外なくイメージリストを要求されますが
画像を用意するのが面倒くさいので今回はシステムが持っているイメージリストを使います

iml.sbpをインクルードしてあればGetSystemImageList関数で取得できます
GetSystemImageList(IconType As DWord)

IconTypeが1で小さいアイコンのイメージリストを、0で大きいアイコンのイメージリストハンドルを返します
今回は小さいアイコンを使います

注意点ですがシステムイメージリストは破棄してはいけません
ImageList_Destroyで明示的に破棄する事はまずないと思いますが
リストビューのスタイルで共有イメージリストの項目にチェックが入っていないとウィンドウの破棄と同時にイメージリストも破棄されてしまう点に注意が必要です
破棄したらどうなるか実際にやって見るのもいいんじゃないか。責任は取れんが

取得したらListView_SetImageList関数でリストビューにイメージリストを割り当てます
ListView_SetImageList(hwnd As HWND,himl As HIMAGELIST,iImageList As Long)

hwndがリストビューのハンドル、himlがイメージリストハンドル、iImageListはイメージのタイプです。iImageList=0で大きいアイコン、1で小さいアイコンです

[edit]
アイテムの追加 †

ほぼイメージリストを使わない時と同じですが設定が必要なメンバにiImageが増えます。またmaskにもLVIF_IMAGEが必要です
iImageメンバには表示するアイコンのイメージリスト中のインデックスを指定します

ファイルに対応したアイコンのインデックスはGetSystemIconIndex関数で得られます
GetSystemIconIndex(FileName As BytePtr,IconType As DWord) As Long

FileNameにはファイルのフルパスを渡します。IconTypeはイメージリストのときと同じです。成功すればインデックスを返しますのでそのままiImageに使えます

[edit]
コード †

ファイルの列挙の方が難しかったりして

Createイベント内
Dim hList As HWND
hList = GetDlgItem(hMainWnd,ListView1)

'イメージリストをセット
ListView_SetImageList(hList,GetSystemImageList(1),1)

'カラムの追加
Dim lvc As LVCOLUMN
lvc.mask = LVCF_TEXT Or LVCF_WIDTH
lvc.cx = 128
lvc.pszText = "ファイル名"
ListView_InsertColumn(hList,0,lvc)
lvc.pszText = "サイズ"
ListView_InsertColumn(hList,1,lvc)

'Cドライブ直下のファイルとフォルダを列挙し、アイテムとサブアイテムを追加
Dim hFind As HANDLE,lvi As LVITEM,ffd As WIN32_FIND_DATA
lvi.mask = LVIF_TEXT Or LVIF_IMAGE
lvi.pszText = ffd.cFileName

hFind = FindFirstFile("C:\*",ffd)
If hFind<>INVALID_HANDLE_VALUE Then
Do
	'ここに来たらffd.cFileNameにファイル名、ffd.nFileSizeLowにファイルサイズが入っている
	lvi.iImage = GetSystemIconIndex("C:\"+MakeStr(ffd.cFileName),1)
	ListView_InsertItem(hList,lvi)
	ListView_SetItemText(hList,lvi.iItem,1,Str$(ffd.nFileSizeLow/1024)+"KB")
	lvi.iItem++
Loop Until FindNextFile(hFind,ffd)=FALSE
FindClose(hFind)
End If

[edit]
サンプル †
listview_sumple2.zip

[edit]
他タイプのリストビューについて †

小さいアイコンとリスト表示はここまでで作ったリストビューの表示スタイルを変更するだけで使えるので試して見れ
唯一大きいアイコン表示だけはイメージリストを変更しないと使用できない

上のコードで行くと
'イメージリストをセット
ListView_SetImageList(hList,GetSystemImageList(1),1)

の部分を
'イメージリストをセット
ListView_SetImageList(hList,GetSystemImageList(0),0)

に変更する
あとは表示スタイルを調整するだけ
レポート表示とそれ以外の大きな違いはサブアイテム表示の有無