「リストビュー(3)」の編集履歴(バックアップ)一覧はこちら

リストビュー(3)」(2010/01/12 (火) 00:02:36) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

リストビューにアイコンを付ける~他タイプのリストビューについて † ↑ [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) に変更する あとは表示スタイルを調整するだけ レポート表示とそれ以外の大きな違いはサブアイテム表示の有無

表示オプション

横に並べて表示:
変化行の前後のみ表示: