동적 아이콘 할당....
아이콘 핸들러를 이용한 동적 아이콘 할당에 대하여 알아보자.
본 내용은 정보문화사의 PROFESSIONAL Visual C++ Windows Programming 의 내용을 발췌
작성할 프로그램은 Bitmap의 색 깊이(저장시 단색, 256색, 16색, 24비트로 나눠서 저장이 가능하다)에 따라 아이콘을 다르게 표시 하도록 하는 것 이다
ATL COM AppWizard를 이용해 프로젝트를 생성한다.
Server Type - Dynamic Link Library(DLL)로 설정한 후 Finish를 클릭~
Class View에서 New ATL Object를 클릭
Objects - Simple Object를 선택하고 이름을 주고 옵션은 디폴트~
* IconHandler 쉘 익스텐션을 위해서는 다음의 두가지 COM인터페이스를 구현해야한다.
1. IExtractIcon
2. IPersistFile
이들 가운데 첫 번째 것은 모듈과 탐색기 사이의 통신을 원할 하게 하기 위한 것 이다. 다시말해, 탐색기는 IExtractIcon Interface의 메소드들을
호출하여 IPersistFile Interface를 통해 로드된 파일과 함께 디스플레이할 아이콘을 요청할 것이다.
IConHandler익스텐션 초기화
이 익스텐션은 선택된 파일뿐만 아니라, 그 어떤 파일에도 적용될수 있으므로 초기화는 IShellExtInt이 아니라, IPersistFile에서 이루어져 야한다.
IPersistFile Interface는 IUnknown에 있는 세개의 함수 이외 6개의 함수로 이루어 져있다.
IPersistFile Interface 6개의 함수의 프로토타입
HRESULT GetClassID(CLSID * pClassID);
HRESULT IsDirty(void);
HRESULT Load(LPCOLESTR pszFileName, DWORD dwMode);
HRESULT Save(LPCOLESTR pszFileName, BOOL fRemember);
HRESULT SaveCompleted(LPCOLESTR pszFileName);
HRESULT GetCurFile(LPOLESTR * ppszFileName);
이번에 제작할 프로그램에서는 이 모든것을 사용 하는것이 아니라 Load() 메소드만으로 충분하다.
다른 메소드들은 E_NOTIMPL을 리턴하도록 설정해 놓으면 된다. Load()를 사용하면 아이콘을 필요로 하는 비트맵의 이름을 저장할 수 있으며, 따라서 그 파일 이름을
유니코드에서 ANSI로 변환 해주고, 그것을 다음에 사용할 수 있도록 데이터 멤버에 저장하기만 하면된다.
아이콘 가져오기
탐색기에서 디스플레이할 아이콘을 구하는 방법은 두가지가 있으며, 이들 각각은 IExtractIcon 인터페이스 메소드이다.
IExtractIcon Interface 2개의 함수 프로토타입
HRESULT Extract(LPCTSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize);
HRESULT GetIconLocation(UINT uFlags, LPTSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags);
이 가운데 GetIconLocation의 경우 사용할 아이콘의 경로와 인덱스를 리턴해 준다. 몇 개의 플래그가 사용되는데, 이 플래그들은 쉘이 그 아이콘을 어떻게 처리해야
하는지를 지시한다. 반면에 Extract의 경우 익스텐션에게 직접 아이콘을 직접 추출할 기회를 주기 위해서 탐색기가 호출하는 것이다.
HRESULT GetIconLocation(
UINT uFlags, // 아이콘을 필요로 하는 이유
LPTSTR szIconFile, // 아이콘의 경로명이 들어갈 버퍼
UINT cchMax, // 위 버퍼의 크기
int *piIndex, // 아이콘 인덱스
UINT *pwFlags // 아이콘에 대한 정보를 쉘에게 보낸다.
);
HRESULT Extract(
LPCTSTR pszFile, // GetIconLocation이 szIconFile을 통해 리턴해준 값.
UINT nIconIndex, // GetIconLocation이 piIndex를 통해 리턴해 준 값.
HICON *phiconLarge, // HICON에 대한 포인터. 큰 아이콘의 핸들을 받는다.
HICON *phiconSmall, // HICON에 대한 포인터. 작은 아이콘의 핸들을 받는다.
UINT nIconSize // 원하는 아이콘의 크기(픽셀단위, LOWORD - 큰아이콘의 사이즈, HIWORD - 작은 아이콘의 사이즈 값이 들어 간다.)
);