SHGetFileInfo 顯示文件類型圖標

需要顯示遠程目錄下文件跟文件夾的圖標,但是軟件並不支持直接獲取遠程目錄下的圖標,這時候就需要讀取本機對應的目錄圖標和對應類型文件圖標。

初始化的時候。需要將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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章