리스트 컨트롤하면 빠질 수 없는 것이 바로 이미지 리스트이다.
리스트에 아이콘이 없다면 앙꼬 없는 찐빵이요.. 오아시스 없는 사막이다. -_-;;;

MFC에서 제공하는 컨트롤중에 이미지 리스트를 이용하는 컨트롤은 보통 2가지 사용한다.
MFC의 CImageList 와 API를 직접 이용하는 HIMAGELIST 이다.

본 강좌는 MFC를 위주로 작성하므로, CImageList를 이용하여 앞으로의 샘플들을 작성한다.

CImageList에 대한 자세한 언급은 추후로 미루며 기본적으로 어떻게 이미지 리스트를 만드는지,
그리고 이미지를 추가하거나 Attach하는지 등에 대하여 먼저 다루어 본다.


이미지 리스트 생성
-------------------------------------------------------------------------------------BOOL Create(int cx, int cy,UINT nFlags, int nInitial, int nGrow);
BOOL Create(UINT nBitmapID,int cx,int nGrow,COLORREF crMask);
BOOL Create(LPCTSTR lpszBitmapID,int cx,int nGrow,COLORREF crMask);
BOOL Create(CImageList& imagelist1,int nImage1,CImageList& imagelist2,int nImage2,int dx,int dy);
BOOL Create(CImageList* pImageList
);

이 5가지 중에 보통 위의 2가지를 주로 사용하며 설명은 다음과 같다.

BOOL Create(int cx, int cy,UINT nFlags, int nInitial, int nGrow);
  cx - 아이콘의 너비
  cy - 아이콘의 높이
  nFlags - 아이콘에 적용될 설정 플래그
     ILC_COLOR - 다른 ILC_COLOR? 가 선언되지 않았을 경우 디폴트로 동작함-ILC_COLOR4
     ILC_COLOR4 - 4 bit DIB
     ILC_COLOR8 - 8 bit DIB
     ILC_COLOR16 - 18 bit DIB
     ILC_COLOR24 - 24 bit DIB
     ILC_COLOR32 - 32 bit DIB
     ILC_COLORDDB - Device Dependents Bitmap
     ILC_MASK - 마스크 컬러값

  ninitial - 초기치 크기
  nGrow - 공간이 모자랄 경우 컨테이너의 확장 단위

BOOL Create(UINT nBitmapID,int cx,int nGrow,COLORREF crMask);
  nBitmapID - 이미지리스트에 넣을 연속 이미지가 들어있는 비트맵의 리소스 아이디
  cx - 비트맵을 쪼갤 너비 단위
  nGrow -  공간이 모자랄 경우 컨테이너의 확장 단위
  crMask - 마스킹하여 제거할 컬러값


이미지 리스트에 추가
-------------------------------------------------------------------------------------
이미지를 Add 메서드를 이용하여 추가할 경우는 한번에 한개씩만 가능하다. 또한 비트맵이나
아이콘을 직접 추가할 수 있다. 크기는 초기에 설정해 놓은 크기대로 잘려서 추가된다.

int Add(CBitmap* pbmImage,CBitmap* pbmMask);
int Add(CBitmap*
pbmImage,COLORREF crMask);
int Add(HICON
hIcon);
  pbmImage - CBitmap 포인터(이미지를 가지고 있는)
  pbmMask -  직접 마스킹할 마스킹 비트맵 포인터
  crMask - 마스킹할 컬러
  hIcon - 아이콘 핸들


이미지 리스트에 Attach
-------------------------------------------------------------------------------------
Win32 API에서 제공되는 HIMAGELIST 를 사용할 수 있도록 제공되는 인터페이스이다.
주로 다른 곳에서 사용되고 있는 이미지 리스트를 가져다 혹은 빌려서 쓸때 사용한다.

BOOL
Attach(HIMAGELIST hImageList);

이건 나중에 시스템의 이미지 리스트를 가져와서 리스트 컨트롤에 붙혀가지고 시스템 아이콘을
사용할 경우 예제를 보여줄 것이다.


이미지 리스트의 사용
-------------------------------------------------------------------------------------
보통 컨트롤에서는 이미지 리스트를 자동으로 연결해주는 SetImageList 와 같은 함수가 있다.
이와는 별도로 리스트 내부에서 원하는 아이콘을 뽑아다 사용할 경우는 다음 메서드를 이용한다.

HICON ExtractIcon(int nImage);

주의. ExtrancIcon을 이용하여 리턴된 HICON 핸들은 이미지 리스트의 내부 핸들의 포인터를
리턴하는것이 아니라, 복사한 핸들을 리턴하기 때문에.. 다 사용하고 나면 CloseHandle()을
이용하여 꼭 해재하여 주어야한다.

이 함수를 루프나 혹은 드로잉 함수에서 그 때 그때, 불러서 사용한다면 길지 않은 시간이
흐른 후 시스템의 리소스가 부족합니다 라는 메시지와 다운 되는 컴퓨터를 보게 될것이다.



첨가. 아이콘을 직접 DC를 이용하여 그릴 때
-------------------------------------------------------------------------------------
가끔 아이콘을 직접 화면에 그려주어야 할 경우가 있을 것이다. 보통 CDC::DrawIcon
이용하여 그리게 되는데, 이것 무조껀 16*16으로 맞추어 그려 버린다. -_-;;;

BOOL DrawIconEx(
  HDC hdc,
  int xLeft,
  int yTop,
  HICON hIcon,
  int cxWidth,
  int cyWidth,
  UINT istepIfAniCur,
  HBRUSH hbrFlickerFreeDraw,
  UINT diFlags
);

Win32 API 중에 위의 DrawIconEx를 이용하여 그리게 되면 원하는 형태와 크기대로 정확하게
화면에 그려줄 수 있다.

+ Recent posts