需要顯示遠程目錄下文件跟文件夾的圖標,但是軟件並不支持直接獲取遠程目錄下的圖標,這時候就需要讀取本機對應的目錄圖標和對應類型文件圖標。
初始化的時候。需要將Imagelist設置給ListCtrl控件。
1
2
3
4
5
6
7
8
9
10
|
// 初始化圖標列表 SHFILEINFO sfi; HIMAGELIST imagelist; imagelist=(HIMAGELIST)SHGetFileInfo(_T( "" ),
0, &sfi,
sizeof (SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON ) ; this ->m_ListCtrl1.InsertColumn(0, _T( "文件名" ), 0, 200); this ->m_ListCtrl1.SetImageList(CImageList::FromHandle(imagelist),LVSIL_SMALL) |
在設置Item信息的時候讀取icon 的索引值
1
2
|
SHFILEINFO sInfo; // 在xp下讀取目錄圖標,strFile可以爲空,但是讀出來的圖標可能是不是我們想要的,可以讀目錄"c:\\windows"的圖標來顯示普通文件夾,這個文件夾xp、win7 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
都有。 <br> CString strFile = _T( "folder" ); SHGetFileInfo(strFile, FILE_ATTRIBUTE_DIRECTORY, &sInfo,
sizeof (sInfo), SHGFI_USEFILEATTRIBUTES|SHGFI_SMALLICON|SHGFI_SYSICONINDEX); this ->m_ListCtrl1.InsertItem(0, strFile, sInfo.iIcon); if
(sInfo.hIcon) DestroyIcon(sInfo.hIcon); strFile = _T( "c:\\windows" ); SHGetFileInfo(strFile, FILE_ATTRIBUTE_DIRECTORY, &sInfo,
sizeof (sInfo), SHGFI_USEFILEATTRIBUTES|SHGFI_SMALLICON|SHGFI_SYSICONINDEX); this ->m_ListCtrl1.InsertItem(1, strFile, sInfo.iIcon); if
(sInfo.hIcon) DestroyIcon(sInfo.hIcon); <br> |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
// 獲取本機cpp文件圖標的用法,其他文件突變類似,就是讀取 .+後綴名 的圖標 strFile = _T( ".cpp" ); SHGetFileInfo(strFile, FILE_ATTRIBUTE_NORMAL, &sInfo,
sizeof (sInfo), SHGFI_USEFILEATTRIBUTES|SHGFI_SMALLICON|SHGFI_SYSICONINDEX); this ->m_ListCtrl1.InsertItem(2, strFile, sInfo.iIcon); if
(sInfo.hIcon) DestroyIcon(sInfo.hIcon); strFile = _T( ".h" ); SHGetFileInfo(strFile, FILE_ATTRIBUTE_NORMAL, &sInfo,
sizeof (sInfo), SHGFI_USEFILEATTRIBUTES|SHGFI_SMALLICON|SHGFI_SYSICONINDEX); this ->m_ListCtrl1.InsertItem(3, strFile, sInfo.iIcon); if
(sInfo.hIcon) DestroyIcon(sInfo.hIcon); <br> |
1
2
3
4
5
6
7
8
|
// 硬盤盤符的圖標跟目錄的圖標又不一樣,這時候直接獲取本機c盤的盤符 strFile = _T( "c:\\" ); SHGetFileInfo(strFile, FILE_ATTRIBUTE_DIRECTORY, &sInfo,
sizeof (sInfo), SHGFI_USEFILEATTRIBUTES|SHGFI_SMALLICON|SHGFI_SYSICONINDEX); this ->m_ListCtrl1.InsertItem(4, strFile, sInfo.iIcon); if
(sInfo.hIcon) DestroyIcon(sInfo.hIcon); <br> |
1
2
3
4
5
6
7
|
// 對於沒有後綴名的文件類型,只有這麼取 strFile = _T( "file" ); SHGetFileInfo(strFile, FILE_ATTRIBUTE_NORMAL, &sInfo,
sizeof (sInfo), SHGFI_USEFILEATTRIBUTES|SHGFI_SMALLICON|SHGFI_SYSICONINDEX); this ->m_ListCtrl1.InsertItem(5, strFile, sInfo.iIcon); if
(sInfo.hIcon) DestroyIcon(sInfo.hIcon); |
調用SHGetFileInfo獲取ImageList的時候,系統會給進程創建一個ImageList的拷貝,裏面只有很少的系統圖標,當你再次用SHGetFileInfo獲取某個文件或者文件類型的圖標時,系統會把這個圖標加到進程的ImageList中,這時候再用InsertItem(5, strFile, sInfo.iIcon);才能顯示圖標,如果不使用SHGetFileInfo去得文件圖標,而是用InsertItem(5, strFile, 7); 直接加個圖標索引值,如7。大多數情況是無法正確顯示圖標的。
工程文件 http://files.cnblogs.com/jianu/SHGetFileInfo.zip