이미지 목록 정보

이미지 목록은 동일한 크기의 이미지 컬렉션으로, 각 이미지는 인덱스에서 참조할 수 있습니다. 이미지 목록은 큰 아이콘 또는 비트맵 집합을 효율적으로 관리하는 데 사용됩니다. 이미지 목록의 모든 이미지는 화면 디바이스 형식의 단일 와이드 비트맵에 포함됩니다. 이미지 목록에는 이미지를 투명하게 그리는 데 사용되는 마스크(아이콘 스타일)가 포함된 단색 비트맵이 포함될 수도 있습니다.

Microsoft Win32 API는 이미지 목록을 만들고 제거하며, 이미지를 추가/제거할 뿐만 아니라 이미지를 바꾸고 병합하며, 그리고 끌 수 있는 이미지 목록 함수와 매크로를 제공합니다. 이미지 목록 함수를 사용하려면 공용 컨트롤 헤더 파일을 소스 코드 파일에 포함하고 공용 컨트롤 내보내기 라이브러리와 연결합니다. 또한 이미지 목록 함수를 호출하기 전에 InitCommonControls 또는 InitCommonControlsEx 함수를 사용하여 공용 컨트롤 DLL이 로드되었는지 확인합니다.

이 섹션에서 설명하는 항목은 다음과 같습니다.

형식

이미지 목록에는 마스킹되지 않은 유형과 마스킹된 유형의 두 가지가 있습니다. 마스킹되지 않은 이미지 목록은 이미지가 하나 이상 포함된 색 비트맵으로 구성됩니다. 마스킹된 이미지 목록은 크기가 동일한 비트맵 두 개로 구성됩니다. 첫 번째는 이미지가 포함된 색 비트맵이고, 두 번째는 첫 번째 비트맵의 각 이미지에 일련의 마스크가 하나씩 포함된 단색 비트맵입니다.

마스크킹되지 않은 이미지를 그리면 대상 디바이스 컨텍스트에 복사만 됩니다. 즉, 디바이스 컨텍스트의 기존 배경색 위에 그려집니다. 마스킹된 이미지를 그리면 이미지 비트가 마스크 비트와 결합되어 일반적으로 대상 디바이스 컨텍스트의 배경색이 표시되는 비트맵에서 투명한 영역을 생성합니다. 마스킹된 이미지를 그릴 때 지정할 수 있는 그리기 스타일은 여러 개가 있습니다. 예를 들어 이미지를 디더링하여 선택한 개체를 나타내도록 지정할 수 있습니다.

이미지 목록 만들기 및 제거

ImageList_Create 함수를 호출하여 이미지 목록을 만듭니다. 매개 변수에는 만들 이미지 목록의 유형, 각 이미지의 크기, 목록에 추가하려는 이미지의 수가 포함됩니다. 마스킹되지 않은 이미지 목록의 경우 함수는 지정된 크기의 지정된 이미지 수를 저장할 수 있을 만큼 큰 단일 비트맵을 만듭니다. 그런 다음 화면 호환 디바이스 컨텍스트를 만들고 비트맵을 선택합니다. 마스킹된 이미지 목록의 경우 함수는 비트맵과 화면 호환 컨텍스트를 두 개씩 만듭니다. 이미지 비트맵을 하나의 디바이스 컨텍스트로 선택하고, 마스크 비트맵을 다른 디바이스 컨텍스트로 선택합니다. 공용 컨트롤 DLL에는 이미지 목록 함수에 대한 실행 코드가 포함되어 있습니다.

ImageList_Create에서 이미지 목록에 있게 될 초기 이미지의 수와 목록이 증가할 수 있는 이미지의 수를 지정합니다. 그러면 처음에 지정한 것보다 더 많은 이미지를 추가하려는 경우 새 이미지를 수용하도록 이미지 목록이 자동으로 증가합니다.

ImageList_Create가 성공하면 HIMAGELIST 형식에 대한 핸들을 반환합니다. 다른 이미지 목록 함수에서 이 핸들을 사용하여 이미지 목록에 액세스하고 이미지를 관리합니다. 이미지를 추가/제거하고, 한 이미지 목록에서 다른 이미지 목록으로 이미지를 복사하고, 두 개의 다른 이미지 목록에서 이미지를 병합할 수 있습니다. 이미지 목록이 더 이상 필요하지 않은 경우 ImageList_Destroy 함수 호출에서 해당 핸들을 지정하여 제거할 수 있습니다.

이미지 추가 및 제거

비트맵 이미지, 아이콘 또는 커서를 이미지 목록에 추가할 수 있습니다. ImageList_Add 함수 호출에서 두 비트맵에 대한 핸들을 지정하여 비트맵 이미지를 추가합니다. 첫 번째 비트맵에는 이미지 비트맵에 추가할 이미지가 하나 이상 포함되고, 두 번째 비트맵에는 마스크 비트맵에 추가할 마스크가 포함되어 있습니다. 마스킹되지 않은 이미지 목록의 경우 두 번째 비트맵 핸들은 무시되며, NULL로 설정할 수 있습니다.

또한 ImageList_AddMasked 함수는 마스킹된 이미지 목록에 비트맵 이미지를 추가합니다. 이 함수는 마스크 비트맵을 지정하지 않는다는 점을 제외하고 ImageList_Add와 비슷합니다. 대신 시스템에서 이미지 비트맵과 결합하여 마스크를 자동 생성하는 색을 지정합니다. 이미지 비트맵에 지정된 색의 각 픽셀이 검은색으로 변경되고, 마스크에 해당하는 비트가 1로 설정됩니다. 따라서 이미지를 그릴 때 지정된 색과 일치하는 이미지의 모든 픽셀이 투명하게 표시됩니다.

ImageList_AddIcon 매크로는 이미지 목록에 아이콘이나 커서를 추가합니다. 이미지 목록이 마스킹되면 ImageList_AddIcon이 아이콘 또는 커서와 함께 제공되는 마스크를 마스크 비트맵에 추가합니다. 이미지 목록이 마스킹되지 않은 경우 이미지를 그릴 때 아이콘 또는 커서용 마스크가 사용되지 않습니다.

ImageList_GetIcon 함수를 사용하여 이미지 및 이미지 목록의 마스크를 기반으로 아이콘을 만들 수 있습니다. 함수는 새 아이콘에 대한 핸들을 반환합니다.

ImageList_Add, ImageList_AddMaskedImageList_AddIcon은 이미지 목록에 추가되는 각 이미지에 인덱스를 할당합니다. 인덱스는 0부터 시작합니다. 즉, 목록의 첫 번째 이미지에는 인덱스가 0개 있고, 다음 이미지에는 인덱스가 1개 있는 등입니다. 단일 이미지를 추가하면 함수가 이미지의 인덱스를 반환합니다. 한 번에 두 개 이상의 이미지를 추가하면 함수가 첫 번째 이미지의 인덱스를 반환합니다.

ImageList_Remove 함수는 이미지 목록에서 이미지를 제거합니다.

이미지 바꾸기 및 병합

ImageList_ReplaceImageList_ReplaceIcon 함수는 이미지 목록의 이미지를 새 이미지로 바꿉니다. ImageList_Replace는 이미지를 비트맵 이미지 및 마스크로 바꾸고, ImageList_ReplaceIcon은 이미지를 아이콘 또는 커서로 바꿉니다.

ImageList_Merge 함수는 두 이미지를 병합하여 새 이미지를 새 이미지 목록에 저장합니다. 새 이미지는 그리기로 생성되고, 두 번째 이미지는 첫 번째 이미지 위에 투명하게 표시됩니다. 새 이미지 마스크는 기존의 두 이미지 마스크 비트에서 논리적 OR 연산을 수행한 결과입니다.

이미지 그리기

이미지를 그리려면 ImageList_Draw 또는 ImageList_DrawEx 함수를 사용합니다. 이미지 목록에 대한 핸들, 그릴 이미지의 인덱스, 대상 디바이스 컨텍스트에 대한 핸들, 디바이스 컨텍스트 내 위치, 하나 이상의 그리기 스타일을 지정합니다.

ILD_TRANSPARENT 스타일을 지정하면 ImageList_Draw 또는 ImageList_DrawEx에서 2단계 프로세스를 사용하여 마스킹된 이미지를 그립니다. 먼저, 이미지 비트와 마스크 비트에서 논리적 AND 작업을 수행합니다. 그런 다음, 첫 번째 작업의 결과와 대상 디바이스 컨텍스트의 백그라운드 비트에서 논리적 XOR 작업을 수행합니다. 이 프로세스는 결과 이미지에 투명한 영역을 만듭니다. 즉, 마스크에 있는 각각의 흰색 비트로 인해 결과 이미지에 해당하는 비트가 투명해집니다.

단색 배경에 마스킹된 이미지를 그리기 전에 ImageList_SetBkColor 함수를 사용하여 이미지 목록의 배경색을 대상과 동일한 색으로 설정해야 합니다. 색을 설정하면 이미지에서 투명 영역을 만들 필요가 없고, ImageList_Draw 또는 ImageList_DrawEx에서 대상 디바이스 컨텍스트에 이미지를 복사하기만 하면 성능이 크게 향상됩니다. 이미지를 그리려면 ImageList_Draw 또는 ImageList_DrawEx 호출에서 ILD_NORMAL 스타일을 지정합니다.

언제든지 마스킹된 이미지 목록의 배경색을 설정하여 모든 단색 배경에 올바르게 그릴 수 있습니다. 배경색을 CLR_NONE으로 설정하면 이미지가 기본적으로 투명하게 그려집니다. 이미지 목록의 배경색을 검색하려면 ImageList_GetBkColor 함수를 사용합니다.

ILD_BLEND25ILD_BLEND50 스타일은 이미지를 시스템 강조 색으로 디더링합니다. 이러한 스타일은 마스킹된 이미지를 이용해 사용자가 선택할 수 있는 개체를 나타내는 경우 유용합니다. 예를 들어 ILD_BLEND50 스타일을 이용해 사용자가 이미지를 선택하면 이를 그릴 수 있습니다.

마스킹되지 않은 이미지는 SRCCOPY 래스터 작업을 사용하여 대상 디바이스 컨텍스트에 복사됩니다. 이미지 색은 디바이스 컨텍스트의 배경색에 관계없이 동일하게 표시됩니다. ImageList_Draw 또는 ImageList_DrawEx에 지정된 그리기 스타일은 마스킹되지 않은 이미지의 모양에도 영향을 주지 않습니다.

이미지 끌기

Win32 API에는 화면에서 이미지를 끌기 위한 함수가 포함되어 있습니다. 끌기 함수는 커서 깜박임 없이 이미지를 컬러로 부드럽게 이동합니다. 마스킹된 이미지와 마스킹되지 않은 이미지를 모두 끌 수 있습니다.

ImageList_BeginDrag 함수는 끌기 작업을 시작합니다. 매개 변수에는 이미지 목록에 대한 핸들, 끌 이미지의 인덱스, 이미지 내 핫 스폿의 위치가 포함됩니다. 핫 스폿은 끌기 함수가 이미지의 정확한 화면 위치로 인식하는 단일 픽셀입니다. 일반적으로 애플리케이션은 마우스 커서의 핫 스폿과 일치하도록 핫 스폿을 설정합니다. ImageList_DragMove 함수는 이미지를 새 위치로 이동합니다.

ImageList_DragEnter 함수는 창 안에서 끌기 이미지의 초기 위치를 설정하고 위치에 이미지를 그립니다. 매개 변수에는 이미지를 그릴 창에 대한 핸들과 창 안 초기 위치의 좌표가 포함됩니다. 좌표는 클라이언트 영역이 아닌, 창의 왼쪽 상단 모서리를 기준으로 합니다. 좌표를 매개 변수로 사용하는 모든 이미지 끌기 함수에 대해서도 마찬가지입니다. 즉, 좌표를 지정할 때 테두리, 제목 표시줄, 메뉴 모음 같은 창 요소의 너비를 보정해야 합니다. ImageList_DragEnter 호출 시 NULL 창 핸들을 지정하는 경우, 끌기 함수는 바탕 화면 창과 연결된 디바이스 컨텍스트에 이미지를 그리고 좌표는 화면의 왼쪽 상단 모서리를 기준으로 합니다.

ImageList_SetDragCursorImage 함수는 지정된 이미지(일반적으로 마우스 커서 이미지)를 현재 끌기 이미지와 결합하여 새로운 끌기 이미지를 만듭니다. 끌기 함수는 끌기 작업 시 새 이미지를 사용하므로, ShowCursor 함수를 사용해 ImageList_SetDragCursorImage를 호출한 후 실제 마우스 커서를 숨겨야 합니다. 그렇지 않으면 끌기 작업을 하는 동안 시스템에 마우스 커서가 두 개 있는 것처럼 보일 수 있습니다.

애플리케이션에서 ImageList_BeginDrag를 호출하면 시스템이 임시 내부 이미지 목록을 만든 후 지정된 끌기 이미지를 내부 목록에 복사합니다. ImageList_GetDragImage 함수를 사용하여 임시 끌기 이미지 목록에 대한 핸들을 검색할 수 있습니다. 또한 이 함수는 현재 끌기 위치와 끌기 위치를 기준으로 끌어 온 이미지의 오프셋을 검색합니다.

이미지 정보

이미지 목록에서 정보를 검색하는 함수가 여러 개 있습니다. ImageList_GetImageInfo 함수는 이미지/마스크 비트맵의 핸들, 픽셀당 색 평면/비트의 수, 이미지 비트맵 내 이미지의 경계 사각형 등 단일 이미지에 대한 정보로 IMAGEINFO 구조체를 채웁니다. 이 정보를 사용하여 이미지의 비트맵을 직접 조작할 수 있습니다. ImageList_GetImageCount 함수는 이미지 목록의 이미지 수를 검색합니다.

이미지 오버레이

모든 이미지 목록에는 오버레이로 사용할 인덱스 목록이 포함되어 있습니다. 오버레이는 다른 이미지 위에 투명하게 그려지는 이미지입니다. 현재 이미지 목록에 있는 이미지를 오버레이로 사용할 수 있습니다. 이미지 목록당 최대 네 개의 오버레이를 지정할 수 있습니다. 이 한도는 버전 4.71에서 15개로 확장되었습니다.

ImageList_SetOverlayImage 함수를 사용해 이미지 목록의 핸들, 기존 이미지의 인덱스, 원하는 오버레이 인덱스를 지정하여 이미지의 인덱스를 오버레이 목록에 추가합니다. 이는 실제로 이미지 목록에 "인덱스 x의 이미지를 오버레이로 사용할 수 있으며, 오버레이 인덱스 y로 참조하려고 합니다."라고 알려 줍니다. 오버레이 인덱스가 0이면 오버레이가 사용되지 않으므로, 오버레이 인덱스는 0부터 시작하지 않고 1부터 시작합니다.

ImageList_Draw 또는 ImageList_DrawEx 함수를 사용하여 이미지를 그릴 때 오버레이를 지정합니다. 오버레이는 원하는 그리기 플래그와 INDEXTOOVERLAYMASK 매크로의 결과 사이에 논리적 OR 연산을 수행하여 지정됩니다. INDEXTOOVERLAYMASK 매크로는 오버레이 인덱스를 가져와 이러한 함수의 플래그와 함께 포함할 형식을 지정합니다. 이렇게 하면 지정된 오버레이로 이미지가 그려집니다. 다음 예제는 이미지를 그릴 때 오버레이를 추가하고 지정하는 방법을 설명합니다.

ImageList_SetOverlayImage(himl, 0, 3);
ImageList_Draw(himl, 1, hdc, 0, 0, ILD_MASK | INDEXTOOVERLAYMASK(3));

이렇게 하면 이미지 1이 그려지고, 해당 이미지가 이미지 0으로 오버레이됩니다. 3은 ImageList_SetOverlayImage 호출에서 지정한 오버레이 인덱스이므로, INDEXTOOVERLAYMASK 매크로에 3이 배치됩니다.

32비트 앤티앨리어스 아이콘

앤티앨리어싱은 날카로운 가장자리를 부드럽게 또는 흐리게 처리하는 기술입니다. 이렇게 하면 이미지가 더 자연스러워 보입니다. Windows Vista 및 Windows 7의 이미지 목록은 32비트 앤티앨리어스 아이콘/비트맵의 사용을 지원합니다. 색 값은 24비트를 사용하고, 8비트를 아이콘의 알파 채널로 사용합니다. 픽셀당 32비트(bpp) 이미지를 처리할 수 있는 이미지 목록을 만들려면 ImageList_Create 함수를 호출하여 ILC_COLOR32 플래그를 전달합니다.

32비트 아이콘을 올바르게 작성하려면 다음 그림과 같이 각 아이콘에 여러 이미지를 만들어야 합니다.

illustration showing three sizes of icons for each of three color depths

  • 처음 세 이미지는 안전 모드에서 사용하기 위한 16색 모드입니다.
  • 다음 세 아이콘은 256색 모드에서 사용됩니다.
  • 마지막 세 아이콘은 알파 채널이 있고 24비트 이상의 색을 실행하는 운영 체제에서만 사용할 수 있습니다.
  • 아이콘 형식의 이미지 순서가 중요합니다. 순서가 잘못되면 아이콘을 추출할 때 이전 버전의 Windows가 제대로 작동하지 않습니다. 아이콘을 잘못 추출하면 메모리가 손상되고 부적절하게 렌더링될 수 있습니다.
  • 이전 버전의 Windows은 아이콘 리소스가 10개로 제한됩니다.

참고

타사 도구를 사용하여 알파 채널이 포함된 아이콘 파일과 비트맵을 생성할 수 있습니다. LoadImage를 사용하여 알파가 포함된 32bpp 비트맵을 로드하는 경우 LR_CREATEDIBSECTION 플래그를 지정해야 합니다.