'CImageList'에 해당되는 글 1건

  1. 2006.08.25 시스템 이미지 얻기

시스템 이미지 얻기

MFC/TIP 2006. 8. 25. 13:03




시스템 이미지 얻기

탐색기 등을 제작하다보면 각각의 파일이나 폴더에 대한 아이콘이 필요하게 된다.
이런 아이콘은 프로그램 제작시 리소스 등을 이용해서 미리 준비한 아이콘을 사용할 수도 있지만 현재 윈도우에서 사용하고 있는 각각의 파일과 폴더에 대한 아이콘을 얻어와서 사용할 수도 있다.
아래의 예는 시스템의 이미지를 얻어와서 리스트컨트롤에 데이터를 뿌려주는 것이다.

1. 우선 이미지 리스트 제작에 관련된 변수를 생성한다.
    CImageList * m_SmallImage;     // SMALL 이미지 리스트
    CImageList * m_LargeImage;     // LARGE 이미지 리스트
    HIMAGELIST hSystemSmall;     // SMALL 시스템 이미지 리스트
    HIMAGELIST hSystemLarge;     // LARGE 시스템 이미지 리스트
    SHFILEINFO shFileInfo;            // 선택된 파일 및 시스템 아이콘 정보

2. 다음으로는 CImageList 변수를 동적 할당 및 해제를 해준다...
    (물론 해제는 프로그램이 종료될 때 사용...)
    // 동적 할당 (초기화 관련 함수에서 코딩)
    m_SmallImage = new CImageList;
    m_LargeImage = new CImageList;

    // 메모리 해제 (OnClose() 함수 등에서 코딩)
    if(m_SmallImage != NULL)
         delete m_SmallImage;
    if(m_LargeImage != NULL)
         delete m_LargeImage;

3. 다음으로는 실제로 시스템 이미지를 얻어오는 과정이다...
  간략히 설명하면 일단 시스템이미지를 얻어온 후 그 정보를 이미지리스트에 등록하고 다시그 정보를 리스트 컨트롤에 등록하는 과정을 거친다.

    // 선택한 폴더내 "파일 & 폴더" 시스템 이미지 리스트 얻기
       (예제 소스는 단순히 'C:\'를 대상으로 했다...

    // 시스템 이미지 얻기
    ZeroMemory(&shFileInfo, sizeof(SHFILEINFO));
    hSystemSmall = (HIMAGELIST)SHGetFileInfo( (LPCTSTR)"C:\\", 0, &shFileInfo,
                     sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON );
    hSystemLarge = (HIMAGELIST)SHGetFileInfo( (LPCTSTR)"C:\\", 0, &shFileInfo,
                     sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_LARGEICON );

    // 시스템 이미지 이미지리스트에 등록
    m_SmallImage->Attach( hSystemSmall );
    m_LargeImage->Attach( hSystemLarge );

    // 이미지리스트 리스트컨트롤에 등록
    m_listCtrl.SetImageList(m_SmallImage, LVSIL_SMALL);
    m_listCtrl.SetImageList(m_LargeImage, LVSIL_NORMAL);

여기서 Small 이미지랑 Large 이미지가 있는데 리스트컨트롤 속성에 따라서 작은아이콘이랑 큰아이콘 두가지 경우가 존재하므로 두가지 모두 얻어오는것이다...
한가지만 필요하면 해당되는것 하나만 얻어오면 된다...
4. 위의 과정을 거치면 시스템의 이미지 리스트가 확보된다...
  이제 이것을 사용하려면 리스트컨트롤에 데이터를 삽입할 때 얻어온 이미지 리스트의 인덱스만을 넣어주면 된다...
   아래와 같이 사용을 한다...

    "LV_ITEM" 구조체를 이용해서 데이터를 삽입할 때 이미지 관련 부분에서 아래와 같이 사용
    ZeroMemory(&shFileInfo, sizeof(SHFILEINFO));
    SHGetFileInfo( (char*)(LPCTSTR)m_fileFinder.GetFilePath(), NULL,
                        &shFileInfo, sizeof(shFileInfo),
                        SHGFI_DISPLAYNAME | SHGFI_ICON | SHGFI_SMALLICON);    
    lvItem.iImage = shFileInfo.iIcon;

(char*)(LPCTSTR)m_fileFinder.GetFilePath() -> 이 부분은 데모소스상에서 CFileFind 클래스를 이용한 부분으로서 얻어오고 싶은 파일이나 폴더의 경로가 된다....
반복문 등에서 지속적으로 호출해서 사용을 하면 된다...

5. 마지막으로 이미지 리스트를 해지해준다..
    m_SmallImage->Detach();
    m_LargeImage->Detach();

이 작업은 동적할당된 메모리 해지와 달리 시스템 이미지를 얻을때마다 해지를 시켜줘야 한다...
얻어온 이미지리스트를 해지하지 않은 상태로 다시 얻어오려고 하면 에러가 발생한다.

(사용언어 및 제작툴 : MFC / VS2003)

Posted by Gungume
,