Programming/MFC

CImageList Class

acidpop 2008. 10. 8. 21:53
반응형

CImageList

CImageList create flags

설 명

ILC_COLOR

디폴트 색상이 적용되는데 포통 ILC_COLOR4가 적용된다

ILC_COLOR4

4비트(16색상)

ILC_COLOR8

8비트(256색상)

ILC_COLOR16

16비트

ILC_COLOR24

24비트

ILC_COLOR32

32비트

ILC_COLORDDB

장치 종속적인 비트맵

ILC_MASK

투명 이미지를 출력하기 위해 마스크를 사용한다

CImageList draw flags

설 명

ILD_BLEND25, ILD_FOCUS

시스템 하이라이트 색상을 25% 섞어서 출력한다. 마스크가 지정되어 있지 않으면 사용할 수 없다. 탐색기에서 파일을 드래그할 때 파일의 아이콘이 평상시보다 훨씬 더 밝아지는 것을 볼 수 있는데 이 방법으로 그린것이다

ILD_BLEND50, ILD_SELECTED, ILD_BLEND

시스템 하이라이트 색상을 50% 섞어서 출력한다

ILD_MASK

마스크를 출력한다

ILD_NORMAL

배경 색상으로 이미지를 출력한다. 배경색상이 CLR_NONE이면 이미지는 마스크를 사용하여 투명하게 그려진다

ILD_TRANSPARENT

마스크를 사용하여 투명한 이미지를 그린다. 마스크가 정의되어 있지 않으면 이 값은 사용할 수 없다

CImageList Operations

설 명

Add

이미지나 이미지들을 이미지 리스트에 추가한다

Attach

이미지 리스트 오브젝트를 이미지 리스트에 Attach시킨다

Detach

이미지 리스트 오브젝트를 이미지 리스트에서 Detach 시킨다

DeleteImageList

이미지 리스트를 지운다

Draw

드레그 & 드롭 중에도 이미지 리스트를 출력한다

Remove

이미지 리스트에서 이미지를 삭제한다

Read

파일에서 이미지 리스트를 읽어온다

Write

파일에 이미지 리스트를 쓴다

ImageList는 동일한 크기를 가진 이미지의 집합으로, 각각의 이미지를 배열항목처럼 취급하여 0 부터 시작하는 인덱스로 참조할수 있도록 만든것.

 

//ImageList를 생성만 하는 함수.

BOOL Create( int cx, int cy, UINT nFlags, int nInitial, int nGrow );

//1,2파라미터 : 이미지의 폭과 넓이

//3 파라미터 : 이미지 리스트의 타입 지정.주로 색상수를 나타냄. ILC_COLOR4일때 4비트(16색상)

//4 파라미터 : 초기에 포함할 이미지의 개수

//5 파라미터 : 새로운 이미지를 추가하기 위해 이미지리스트의 메모리를 재할당할때 얼마만큼의 여분의 메모리를 할당할것인가를 나타냄. 4 = 이미지 4개를 추가할 만큼 할당.

 

//ImageList를 생성함과 동시에 비트맵 이미지로 초기화까지 하는 함수.

BOOL Create( UINT nBitmapID, int cx, int nGrow, COLORREF crMask );

//1 파라미터 : 비트맵소스의 리소스 ID

//2 파라미터 : 이미지의 폭(y값 자동 지정)

//3 파라미터 : 새로운 이미지를 추가하기 위해 이미지리스트의 메모리를 재할당할때 얼마만큼의 여분의 메모리를 할당할것인가를 나타냄. 4 = 이미지 4개를 추가할 만큼 할당.

//4 파라미터 : 투명색으로 사용할 색상 지정.

 

 

예제)

CImageList m_il1, m_il2;

m_il1.Create(32, 32, ILC_COLOR4, 2, 1);

m_il2.Create(IDB_BITMAP1, 48, 1, RGB(255,255,255));

 

 

//이미지 추가

 

//Icon 추가

int Add( HICON hIcon );

//hIcon: 아이콘 리소스를 가리키는 핸들값, CWinApp::LoadIcon()의 리턴값을 사용하면 됨.

 

//Bitmap 추가

int Add( CBitmap* pbmImage, COLORREF crMask );

// 1 파라미터 : 비트맵 리소스를 담고 있는 CBitmap 객체의 주소

// 2 파라미터 : 투명색 지정.

 

예제)

//Icon추가

m_il1.Add(AfxGetApp()->LoadIcon(IDI_ICON1));

m_il1.Add(AfxGetApp()->LoadIcon(IDI_ICON2));

 

//Bitmap추가

CBitmap bitmap;

bitmap.LoadBitmap(IDB_BITMAP1);

m_il2.Add(&bitmap, RGB(255,255,255));

 

 

//화면 출력

CImageList::Draw(), CImageList::DrawIndirect(), CImageList::DrawEx()를 사용.

DrawEx는 MFC 7.0 이상에서만 가능.

 

BOOL Draw( CDC* pdc, int nImage, POINT pt, UINT nStyle );

//1 파라미터 : 출력할 대상을 나타내는 Device Context

//2 파라미터 : 출력할 이미지의 인덱스

//3 파라미터 : 출력 좌표

//4 파라미터 : 그리기 스타일을 지정하는 값으로

nStyle

Flag specifying the drawing style. It can be one or more of these values:

Value Meaning
ILD_BLEND25, ILD_FOCUS 시스템 하이라이트(Highlight) 색상을 25% 섞어서 출력.
ILD_BLEND50, ILD_SELECTED, ILD_BLEND 시스템 하이라이트(Highlight) 색상을 50% 섞어서 출력.
ILD_MASK 마스크를 출력한다.
ILD_NORMAL 이미지의 배경색을 이용하여 출력하며, 배경색이 CLR_NONE으로 설정된 경우 마스크를 이용하여 이미지를 투명하게 출력.
ILD_TRANSPARENT 마스크를 이용하여 이미지를 투명하게 출력한다.

 

예제)

Void CExImageListView::OnDraw (CDC* pDC)

{

 m_il.SetBkColor (CLR_NONE); //배경색 설정 (CLR_NONE은 투명색)

 m_il.Draw (pDC, 0, CPoint(100, 200), ILD_NORMAL); //투명 출력

 m_il.Draw (pDC, 0, CPoint(150, 200), ILD_BLEND25);

 m_il.Draw (pDC, 0, CPoint(200, 200), ILD_BLEND50); //투명 출력

 m_il.Draw (pDC, 0, CPoint(250, 200), ILD_MASK);

}

 //리스트 컨트롤과 이미지 리스트 연결

 

CListCtrl::SetImageList

CImageList* SetImageList( CImageList* pImageList, int nImageList );

Return Value

A pointer to the previous image list.

Parameters

pImageList

Pointer to the image list to assign.

nImageList

Type of image list. It can be one of these values:

  • LVSIL_NORMAL   Image list with large icons.

  • LVSIL_SMALL   Image list with small icons.

  • LVSIL_STATE   Image list with state images.

예제)

m_ObjectList.SetImageList(m_largeImage, LVSIL_NORMAL);

 

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

HICON ExtractIcon(int nImage);

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

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

[출처] CImageList Class|작성자 러브러브

반응형