이미지 목록 정보

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

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개의 오버레이를 지정할 수 있습니다. 이 제한은 버전 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를 사용하여 알파가 포함된 32 bpp 비트맵을 로드하는 경우 LR_CREATEDIBSECTION 플래그를 지정해야 합니다.