void GetFileInfo(LPSTR lpFileName, int *nIndex)
{
 SHFILEINFO sfi;

 int hIcon = SHGetFileInfo(lpFileName, DIRATTR, &sfi, sizeof(SHFILEINFO), 
        SHGFI_TYPENAME | SHGFI_SYSICONINDEX | SHGFI_ICONLOCATION); 
 *nIndex = sfi.iIcon;
 
 lpDesc=(TCHAR *)calloc(sizeof(TCHAR), 1024);
 strcpy(lpDesc, sfi.szTypeName);
}

 

사용자 정의 함수이고, lpFileName으로 들어온 파일이름(절대경로)을 시스템 이미지 리스트에 등록되어 있는 아이콘 인덱스를 찾아서

 

sfi 구조체의 iIcon 이라는 멤버에 값을 넣어주게 됩니다.  아래에 있는 lpDesc에서는 그 파일이 무슨 타입인지(디렉토리라든지 시스템 파일 이라든지 하는 문자열)를 저장하는 전역 변수고요, 사용한 곳에서 free() 시켜줍니다.

 

리스트 뷰의 프로시져에서 다음과 같이 시스템 이미지 리스트를 따옵니다.

 

s_hImageList= (HIMAGELIST)SHGetFileInfo("C:\\",0,&sfi,sizeof(SHFILEINFO),SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
l_hImageList= (HIMAGELIST)SHGetFileInfo("C:\\",0,&sfi,sizeof(SHFILEINFO),SHGFI_SYSICONINDEX | SHGFI_ICON);
SendMessage(hList, LVM_SETIMAGELIST, (WPARAM)LVSIL_SMALL, (LPARAM)s_hImageList);
SendMessage(hList, LVM_SETIMAGELIST, (WPARAM)LVSIL_NORMAL, (LPARAM)l_hImageList);

 

저는 리스트 뷰에서 구현했기 때문에 이렇게 했습니다.  이렇게 하면 시스템 이미지 리스트를 가져오게 됩니다.  첫번째는 작은 아이콘(16*16), 두번째는 노말한 아이콘(32*32)에 대한 리스트를 따오는 것이구요, 2개의 SendMessage()를 통해서 해당 리스트 뷰에 이미지 리스트를 등록합니다.  다음은 해당 디렉토리의 파일들을 검색하면서 정보를 따오는 부분이고요...

 

LI.mask = LVIF_TEXT | LVIF_IMAGE;

handle = FindFirstFile(fileFound, &ffdata);
 do
    {

      .........

         GetFileInfo(fullName, &iIcon);

         LI.iImage = iIcon;

      ........

         strcpy(LI.pszText, lpDesc);
         free(lpDesc);

    } while (FindNextFile(handle, &ffdata));
 FindClose(handle);

 

아까 정의했던 GetFileInfo를 사용해서 아이콘 인덱스를 가져오고, 해당 파일의 속성을 가져왔습니다.  당근 free() 하구요 :)

Posted by 강군님
TAG ,

댓글을 달아 주세요