목록 뷰 컨트롤 정보

가상 목록 뷰 컨트롤 샘플을 참조하세요.

목록 뷰 컨트롤은 항목 컬렉션을 표시하는 창입니다. 목록 뷰 컨트롤은 항목을 정렬하고 표시하는 여러 가지 방법을 제공하며 간단한 목록 상자보다 훨씬 유연합니다. 예를 들어 각 항목에 대한 추가 정보를 아이콘 및 레이블 오른쪽의 열에 표시할 수 있습니다.

목록 뷰 스타일 및 뷰

목록 뷰 컨트롤은 5개의 다른 뷰에서 항목을 표시할 수 있습니다. 컨트롤의 창 스타일은 기본 뷰를 지정합니다. 추가 창 스타일은 항목 및 컨트롤 관련 기능의 맞춤을 지정합니다. 다음 표는 이러한 뷰에 대해 설명합니다.

보기 이름 설명
아이콘 뷰 LVS_ICON 창 스타일 또는 LVM_SETVIEW 메시지와 함께 LV_VIEW_ICON을 전달하여 지정됩니다. 각 항목이 아래에 레이블이 있는 전체 화면 크기의 아이콘으로 나타납니다. 사용자는 목록 뷰 창의 모든 위치로 항목을 끌 수 있습니다.
작은 아이콘 뷰 LVS_SMALLICON 창 스타일 또는 LVM_SETVIEW와 함께 LV_VIEW_SMALLICON을 전달하여 지정됩니다. 각 항목이 오른쪽에 해당 레이블이 있는 작은 아이콘으로 나타납니다. 사용자는 항목을 모든 위치로 끌 수 있습니다.
목록 뷰 LVS_LIST 창 스타일 또는 LVM_SETVIEW와 함께 LV_VIEW_LIST를 전달하여 지정됩니다. 각 항목이 오른쪽에 레이블이 있는 작은 아이콘으로 나타납니다. 항목은 열에서 정렬되며 사용자는 임의의 위치로 끌어다 놓을 수 없습니다.
보고서(세부 정보) 뷰 LVS_REPORT 창 스타일 또는 LVM_SETVIEW와 함께 LV_VIEW_DETAILS를 전달하여 지정합니다. 각 항목은 열에서 정렬된 정보와 함께 자체 줄에 나타납니다. 맨 왼쪽 열은 항상 왼쪽 정렬되며 작은 아이콘과 레이블을 포함합니다. 후속 열에는 애플리케이션에서 지정한 것처럼 하위 항목을 포함합니다. LVS_NOCOLUMNHEADER 창 스타일도 지정하지 않으면 각 열에는 헤더가 있게 됩니다.
바둑판식 뷰 버전 6 이상. LVM_SETVIEW와 함께 LV_VIEW_TILE를 전달하여 지정됩니다. 각 항목은 하나 이상의 줄 레이블이 있는 전체 크기 아이콘으로 나타납니다.

 

다음 스크린샷은 뷰를 사용하여 7가지 반려동물 각각에 대한 다양한 양의 정보를 표시합니다. 뷰는 Windows Vista에 정보가 표시되는 방법을 보여 줍니다. 컨트롤의 시각적 스타일은 SetWindowTheme을 사용하여 "탐색기" 테마로 설정되었습니다.

다음 스크린샷은 세부 정보 뷰를 보여줍니다.

screen shot that shows information in five columns and seven rows

다음 스크린샷은 아이콘 뷰를 보여줍니다.

screen shot that shows only the name of each pet and an icon indicating the species

다음 스크린샷은 목록 뷰를 보여줍니다.

screen shot that shows, for each pet, a large icon next the text of the pet's name, breed, and price

다음 스크린샷은 타일 뷰를 보여줍니다.

tile view.

목록 뷰 컨트롤을 만든 후 뷰 유형을 변경할 수 있습니다. 창 스타일을 검색하고 변경하려면 GetWindowLongSetWindowLong 함수를 사용합니다. 현재 뷰의 창 스타일을 확인하려면 LVS_TYPEMASK 값을 사용합니다.

LVS_ALIGNTOP(기본값) 또는 LVS_ALIGNLEFT 창 스타일을 지정하여 아이콘 또는 작은 아이콘 뷰에서 항목이 정렬되는 방식을 제어할 수 있습니다.

목록 뷰 컨트롤을 만든 후 맞춤을 변경할 수 있습니다. 현재 맞춤을 확인하려면 LVS_ALIGNMASK 값을 사용합니다.

추가 창 스타일은 사용자가 레이블을 편집하거나 한 번에 둘 이상의 항목을 선택할 수 있는지 여부와 같은 다른 옵션을 제공합니다. 전체 목록은 목록 뷰 창 스타일을 참조하세요.

확장 목록 뷰 스타일

확장 목록 뷰 컨트롤 스타일은 확인란, 플랫 스크롤 막대, 눈금선 및 핫 추적과 같은 옵션을 제공합니다. 전체 목록은 확장 목록 뷰 스타일을 참조하세요. 표준 창 스타일과 동일한 방식으로 확장 목록 뷰 스타일에 액세스하지 않습니다. GetWindowLongSetWindowLong 함수를 사용하여 확장 스타일을 변경하지 않습니다.

확장 스타일 정보(LVM_SETEXTENDEDLISTVIEWSTYLELVM_GETEXTENDEDLISTVIEWSTYLE)를 설정하고 검색하는 두 개의 메시지가 있습니다. 메시지를 명시적으로 보내는 대신 ListView_SetExtendedListViewStyle, ListView_SetExtendedListViewStyleExListView_GetExtendedListViewStyle와 같은 해당 매크로를 사용할 수 있습니다.

가상 목록 뷰 스타일

가상 목록 뷰는 LVS_OWNERDATA 스타일이 있는 목록 뷰 컨트롤입니다. 이 스타일을 사용하면 소유자가 항목 데이터를 관리하는 부담을 받기 때문에 컨트롤에서 수백만 개의 항목을 처리할 수 있습니다. 이렇게 하면 특정 데이터 액세스 방법이 이미 있는 대규모 정보 데이터베이스와 함께 가상 목록 뷰 컨트롤을 사용할 수 있습니다.

가상 목록 뷰 컨트롤은 항목 정보 자체를 거의 유지하지 않습니다. 항목 선택 및 포커스 정보를 제외하고 컨트롤의 소유자는 모든 항목 정보를 관리해야 합니다. 다른 프로세스는 LVN_GETDISPINFO 알림 코드를 사용하여 소유자에게 항목 정보를 요청합니다.

이 유형의 목록 컨트롤은 대용량 데이터 집합을 위한 것이므로 검색 성능을 향상시키기 위해 요청된 항목 데이터를 캐시하는 것이 좋습니다. 목록 뷰는 캐시 최적화를 지원하는 캐시 힌트 메커니즘을 제공합니다. 힌트는 LVN_ODCACHEHINT 알림 코드 형식으로 구현됩니다.

가상 목록 뷰 컨트롤 만들기

LVS_OWNERDATA 창 스타일을 dwStyle 함수 매개 변수의 일부로 지정하는 CreateWindow 또는 CreateWindowEx 함수를 사용하여 가상 목록 뷰 컨트롤을 만듭니다. LVS_OWNERDATA 스타일과의 동적인 전환은 지원되지 않습니다.

LVS_SORTASCENDING 또는 LVS_SORTDESCENDING 스타일을 제외한 대부분의 다른 창 스타일과 함께 LVS_OWNERDATA 스타일을 사용할 수 있습니다. 모든 가상 목록 뷰 컨트롤은 기본적으로 LVS_AUTOARRANGE 스타일로 설정됩니다.

목록에 항목을 표시할 수 있도록 하려면 먼저 명시적으로 또는 ListView_SetItemCountEx 매크로를 사용하여 LVM_SETITEMCOUNT 메시지를 보내야 합니다.

LVS_OWNERDATA 스타일에서 지원되지 않는 메시지는 LVM_ENABLEGROUPVIEW, LVM_GETITEMTEXT, LVM_SETTILEINFOLVM_MAPIDTOINDEX입니다.

호환성 문제

아이콘, 작은 아이콘, 목록 및 보고서 뷰의 네 가지 목록 뷰 스타일은 모두 LVS_OWNERDATA 스타일을 지원합니다. LVS_OWNERDATA 스타일이 있는 목록 뷰 컨트롤은 항목별 정보를 저장하지 않습니다. 따라서 항목에 적용할 수 있는 유일한 유효한 항목 상태 플래그는 LVIS_SELECTEDLVIS_FOCUSED입니다. 다른 상태 정보는 저장되지 않습니다. 특히 목록 뷰 컨트롤은 각 항목에 대한 상태 또는 오버레이 이미지를 유지하지 않습니다. 그러나 LVM_SETCALLBACKMASK 메시지를 전송하여 목록 뷰 컨트롤이 애플리케이션에서 이러한 이미지에 대해 쿼리되도록 할 수 있습니다.

대부분의 목록 뷰 컨트롤 메시지와 연결된 매크로는 완전히 지원됩니다. 그러나 일부 메시지는 제한 사항이 있거나 LVS_OWNERDATA 스타일을 사용할 때 지원되지 않습니다. 다음 표에서는 영향을 받는 메시지를 요약합니다.

메시지 제한 사항
LVM_ARRANGE LVA_SNAPTOGRID 스타일을 지원하지 않습니다.
LVM_DELETEALLITEMS 항목 수를 0으로 설정하고 모든 내부 선택 변수를 지우지만 실제로 항목을 삭제하지는 않습니다. 알림 콜백을 만듭니다.
LVM_DELETEITEM 선택 무결성에 대해서만 지원되며 실제로 항목을 삭제하지 않습니다.
LVM_GETITEMSTATE 포커스 및 선택 상태(즉, 목록 뷰 컨트롤에 의해 저장된 상태)만 반환합니다.
LVM_GETNEXTITEM 목록 뷰 검색 조건 LVNI_CUT, LVNI_HIDDEN 또는 LVNI_DROPHILITED를 지원하지 않습니다. 모든 다른 조건은 지원됩니다.
LVM_GETWORKAREAS 지원되지 않습니다.
LVM_INSERTITEM 선택 무결성에 대해서만 지원됩니다.
LVM_SETITEM 지원되지 않습니다. 항목 상태를 설정하려면 ListView_SetItemState 메시지를 사용합니다.
LVM_SETITEMCOUNT 목록에 현재 들어 있는 항목의 개수를 설정합니다. 목록 뷰 컨트롤이 최대 집합까지 항목에 대한 데이터를 요청하는 알림을 보내는 경우 소유자는 해당 데이터를 제공할 준비가 되어 있어야 합니다. 메시지 매개 변수는 가상 목록 뷰 컨트롤을 지원합니다.
LVM_SETITEMPOSITION 지원되지 않습니다.
LVM_SETITEMSTATE 항목에 대한 선택 및 포커스 상태만 변경할 수 있습니다.
LVM_SETITEMTEXT 지원되지 않습니다. 항목 텍스트를 유지 관리하는 것은 애플리케이션의 책임입니다.
LVM_SETWORKAREAS 지원되지 않습니다.
LVM_SORTITEMS 지원되지 않습니다. 원하는 순서로 항목을 표시하는 것은 애플리케이션의 책임입니다.

 

가상 목록 뷰 제어 알림 코드 처리

LVS_OWNERDATA 스타일을 사용하는 목록 뷰 컨트롤은 다른 목록 뷰 컨트롤과 동일한 알림 코드와 LVN_ODCACHEHINTLVN_ODFINDITEM 두 개의 추가 알림 코드를 보냅니다. 다음은 LVS_OWNERDATA 스타일을 사용하는 목록 뷰 컨트롤이 보내는 가장 일반적인 알림입니다.

알림 설명
LVN_GETDISPINFO 가상 목록 뷰 컨트롤은 자체적으로 항목 정보를 거의 유지 관리하지 않습니다. 따라서 항목 정보를 요청하기 위해 LVN_GETDISPINFO 알림 코드를 보내는 경우가 많습니다. 이 메시지는 표준 목록 컨트롤의 콜백 항목과 거의 동일한 방식으로 처리됩니다. 컨트롤에서 지원하는 항목 수가 매우 클 수 있으므로 항목 데이터를 캐싱하면 성능이 향상됩니다. LVN_GETDISPINFO를 처리할 때 컨트롤 소유자는 먼저 캐시에서 요청된 항목 정보를 제공하려고 시도합니다(자세한 내용은 캐시 관리 참조). 요청된 항목이 캐시되지 않은 경우 소유자는 다른 수단으로 정보를 제공할 준비가 되어 있어야 합니다.
LVN_ODCACHEHINT 가상 목록 뷰는 캐시 최적화를 지원하기 위해 LVN_ODCACHEHINT 알림 코드를 보냅니다. 알림 코드는 캐시할 것을 권장하는 항목 범위에 대한 포괄 인덱스 값을 제공합니다. 알림 코드를 받으면 소유자가 요청된 범위에 대한 항목 정보와 함께 캐시를 로드할 준비가 되어 있어야 LVN_GETDISPINFO 메시지가 전송될 때 정보를 쉽게 사용할 수 있습니다.
LVN_ODFINDITEM 컨트롤에서 특정 콜백 항목을 찾아야 하는 경우 LVN_ODFINDITEM 알림 코드는 가상 목록 뷰 컨트롤에 의해 전송됩니다. 알림 코드는 목록 뷰 컨트롤이 빠른 키 액세스를 받거나 LVM_FINDITEM 메시지를 받을 때 전송됩니다. 검색 정보는 NMLVFINDITEM 구조체의 멤버인 LVFINDINFO 구조체의 형태로 전송됩니다. 소유자는 목록 뷰 컨트롤에서 제공한 정보와 일치하는 항목을 검색할 준비가 되어 있어야 합니다. 소유자는 성공하면 항목의 인덱스를 반환하거나 일치하는 항목이 없으면 -1을 반환합니다.

 

캐시 관리

LVS_OWNERDATA 스타일을 사용하는 목록 뷰 컨트롤은 많은 수의 LVN_GETDISPINFO 알림 코드를 생성하고 캐시 최적화를 지원하기 위해 LVN_ODCACHEHINT 메시지를 생성합니다. LVN_ODCACHEHINT 메시지는 캐시 내에 포함할 권장 항목에 대한 정보를 제공합니다. 이러한 메시지는 WM_NOTIFY 메시지로 전송되며 lParam 값은 NMLVCACHEHINT 구조체의 주소 역할을 합니다.

NMLVCACHEHINT 구조체에는 필요할 가능성이 가장 높은 항목 범위의 포괄 엔드포인트를 나타내는 iFromiTo라는 두 개의 정수 멤버가 포함됩니다. 소유자는 권장 범위 내의 각 항목에 대한 항목 정보와 함께 캐시를 로드할 준비가 되어 있어야 합니다.

목록 컨트롤에는 첫 번째 항목(오프셋 0)에 대한 항목 정보가 필요한 경우가 많습니다. LVN_ODCACHEHINT 알림 코드에 항상 항목 0이 포함되지는 않지만 항상 캐시에 포함되어야 합니다.

목록의 마지막 항목은 자주 액세스됩니다. 따라서 소유자는 목록 끝에 항목이 포함된 두 번째 캐시를 유지하고 싶을 수 있습니다. LVN_ODCACHEHINT에서 요청된 범위를 엔드 캐시에 대해 검사하여 매번 동일한 끝 범위를 다시 로드하는 대신 자동으로 사용할 수 있도록 할 수 있습니다.

목록 뷰 작업 영역

목록 뷰 컨트롤은 목록 뷰 컨트롤이 항목을 정렬하는 데 사용하는 직사각형 가상 영역인 작업 영역을 지원합니다. 작업 영역은 창이 아니며 표시되는 테두리를 가질 수 없습니다. 기본적으로 목록 보기 컨트롤에는 작업 영역이 없습니다. 작업 영역을 만들어서 항목의 왼쪽, 위쪽, 오른쪽에 빈 테두리를 만들거나, 일반적으로 테두리가 없을 때 가로 스크롤 막대가 표시되도록 할 수 있습니다.

작업 영역을 만들면 작업 영역 내에 있는 항목이 작업 영역의 구성원이 됩니다. 마찬가지로 항목이 작업 영역으로 이동되면 항목은 해당 작업 영역의 멤버가 됩니다. 항목이 작업 영역 내에 있지 않으면 자동으로 첫 번째(인덱스 0) 작업 영역의 멤버가 됩니다. 특정 작업 영역 내에 새 항목을 배치하려면 먼저 항목을 만든 다음 LVM_SETITEMPOSITION 또는 LVM_SETITEMPOSITION32 메시지를 사용하여 원하는 작업 영역으로 이동해야 합니다.

다음 그림은 각각 클라이언트 영역의 다른 사분면에 있는 4개의 작업 영역을 포함하는 목록 뷰 컨트롤의 예입니다.

screen shot of a list-view control with one working area in each quadrant of the client area

하나의 뷰 내에서 다른 영역을 만드는 데 여러 작업 영역을 사용할 수 있습니다. 의미가 다른 단일 뷰에서 영역을 만들 수 있습니다. 예를 들어 파일 시스템의 뷰에는 읽기/쓰기 파일에 대한 영역과 읽기 전용 파일의 다른 영역이 있을 수 있습니다. 사용자는 다른 작업 영역에 배치하여 항목을 분류할 수 있습니다. 파일이 읽기 전용 영역으로 이동되면 자동으로 읽기 전용이 됩니다.

여러 작업 영역이 교차할 수 있지만 교집합 내에 있는 모든 항목은 인덱스가 낮은 영역의 멤버가 됩니다. 따라서 이 상황을 방지하는 것이 가장 좋습니다. 여러 작업 영역을 정렬할 때 항목은 동일한 작업 영역의 다른 항목과 비교하여 정렬됩니다.

LVM_GETNUMBEROFWORKAREAS 메시지를 사용하여 작업 영역 수를 검색할 수 있습니다. 작업 영역은 LVM_SETWORKAREAS 메시지를 사용하여 변경되며 LVM_GETWORKAREAS 메시지를 사용하여 검색할 수 있습니다. 두 메시지 모두 RECT 구조체 배열의 주소를 lParam으로 사용하고 RECT 구조체의 수를 wParam으로 사용합니다. 이러한 구조체의 왼쪽위쪽 멤버는 작업 영역의 왼쪽 위 모서리(원점)의 좌표를 지정하고 오른쪽아래쪽 멤버는 작업 영역의 오른쪽 아래 모서리를 지정합니다. 모든 좌표는 목록 뷰의 클라이언트 좌표에 있습니다. 허용되는 최대 작업 영역 수는 LV_MAX_WORKAREAS 값으로 정의됩니다.

작업 영역을 변경해도 LVS_LIST 또는 LVS_REPORT 뷰가 있는 목록 뷰 컨트롤에는 영향을 주지 않지만 뷰 유형이 변경되면 작업 영역이 유지됩니다. LVS_ICONLVS_SMALLICON 뷰를 사용하면 작업 영역을 수정하여 항목이 표시되는 방식을 변경할 수 있습니다. 작업 영역의 너비(오른쪽-왼쪽)를 컨트롤의 클라이언트 너비보다 크게 설정하면 항목이 해당 너비로 래핑되고 가로 스크롤 막대가 표시됩니다. 작업 영역의 너비를 컨트롤의 클라이언트 영역 너비보다 좁게 만들면 항목이 클라이언트 영역이 아닌 작업 영역 내에 래핑됩니다. 왼쪽 또는 위쪽 멤버를 양수 값으로 설정하면 작업 영역부터 항목이 표시되어 컨트롤 가장자리와 항목 사이에 빈 공간이 생성됩니다. 작업 영역의 너비를 컨트롤의 클라이언트 너비보다 작게 만들어 컨트롤의 오른쪽 가장자리와 항목 사이에 빈 공간을 만들 수도 있습니다.

목록 뷰 이미지 목록

기본적으로 목록 뷰 컨트롤은 항목 이미지를 표시하지 않습니다. 항목 이미지를 표시하려면 이미지 목록을 만들고 컨트롤과 연결해야 합니다. 목록 뷰 컨트롤에는 다음 세 개의 이미지 목록이 있을 수 있습니다.

  • 컨트롤이 아이콘 뷰에 있을 때 표시되는 전체 크기의 아이콘이 포함된 이미지 목록입니다.
  • 컨트롤이 작은 아이콘 뷰, 목록 뷰 또는 보고서 뷰일 때 표시되는 작은 아이콘이 들어 있는 이미지 목록입니다.
  • 전체 크기 또는 작은 아이콘의 왼쪽에 표시되는 상태 이미지가 포함된 이미지 목록입니다. 선택 및 선택 해제된 확인란과 같은 상태 이미지를 사용하여 애플리케이션 정의 항목 상태를 나타낼 수 있습니다. 상태 이미지는 아이콘 뷰, 작은 아이콘 뷰, 목록 뷰 및 보고서 뷰에 표시됩니다.

전체 크기 및 작은 아이콘 이미지 목록에는 항목 아이콘 위에 투명하게 그려지도록 설계된 오버레이 이미지도 포함될 수 있습니다.

목록 뷰 컨트롤에서 오버레이 이미지를 사용하려면 다음을 수행합니다.

  1. ImageList_SetOverlayImage 함수를 호출하여 전체 크기 및 작은 아이콘 이미지 목록의 이미지에 오버레이 이미지 인덱스를 할당합니다. 오버레이 이미지는 하나의 기반 인덱스로 식별됩니다.
  2. ListView_InsertItem 또는 ListView_SetItem 매크로를 호출할 때 오버레이 이미지 인덱스와 항목을 연결할 수 있습니다. INDEXTOOVERLAYMASK 매크로를 사용하여 항목의 LVITEM 구조체의 상태 멤버에 오버레이 이미지 인덱스를 지정합니다. 또한 stateMask 멤버에서 LVIS_OVERLAYMASK 비트를 설정해야 합니다.

상태 이미지 목록을 지정하면 목록 뷰 컨트롤은 상태 이미지의 각 항목 아이콘 왼쪽에 공간을 예약합니다.

상태 이미지를 항목과 연결하려면 INDEXTOSTATEIMAGEMASK 매크로를 사용하여 LVITEM 구조체의 state 멤버에 상태 이미지 인덱스를 지정합니다. 인덱스는 컨트롤의 상태 이미지 목록에서 이미지를 식별합니다. 이미지 목록 인덱스는 0부터 시작하지만 컨트롤은 1부터 시작하는 인덱스를 사용하여 상태 이미지를 식별합니다. 상태 이미지 인덱스가 0이면 항목에 상태 이미지가 없음을 나타냅니다.

기본적으로 목록 뷰 컨트롤이 제거되면 여기에 할당된 이미지 목록이 삭제됩니다. 그러나 목록 뷰 컨트롤에 LVS_SHAREIMAGELISTS 창 스타일이 있는 경우 애플리케이션은 더 이상 사용되지 않을 때 이미지 목록을 삭제해야 합니다. 여러 목록 뷰 컨트롤에 동일한 이미지 목록을 할당하는 경우 이 스타일을 지정해야 합니다. 그렇지 않으면 둘 이상의 컨트롤이 동일한 이미지 목록을 삭제하려고 시도할 수 있습니다.

목록 뷰 항목 및 하위 항목

목록 뷰 컨트롤의 각 항목에는 아이콘, 레이블, 현재 상태 및 애플리케이션 정의 값이 있습니다. 목록 뷰 메시지를 사용하여 항목을 추가, 수정 및 삭제하고 항목에 대한 정보를 검색할 수 있습니다.

각 항목에는 하나 이상의 하위 항목이 있을 수 있습니다. 하위 항목은 보고서 뷰에서 항목의 아이콘 및 레이블과 별도로 열에 표시되는 문자열입니다. 하위 항목의 텍스트를 지정하려면 LVM_SETITEMTEXT 또는 LVM_SETITEM 메시지를 사용합니다. 목록 뷰 컨트롤의 모든 항목에는 동일한 수의 하위 항목이 있습니다. 하위 항목의 수는 목록 뷰 컨트롤의 열 수에 따라 결정됩니다. 목록 뷰 컨트롤에 열을 추가할 때 연결된 하위 항목 인덱스를 지정합니다.

LVITEM 구조체는 목록 뷰 항목 또는 하위 항목을 정의합니다. iItem 멤버는 아이템의 0부터 시작하는 인덱스입니다. 구조체에 항목에 대한 정보가 포함된 경우 iSubItem 멤버는 하위 항목의 1부터 시작하는 인덱스이거나 0입니다. 추가 멤버는 항목의 텍스트, 아이콘, 상태 및 항목 데이터를 지정합니다. 항목 데이터는 목록 뷰 항목과 연결된 애플리케이션 정의 값입니다.

목록 뷰 컨트롤에 항목을 추가하려면 LVM_INSERTITEM 메시지를 사용하여 LVITEM 구조체의 주소를 지정합니다. 여러 항목을 추가하기 전에 컨트롤에 궁극적으로 포함할 항목 수를 지정하는 LVM_SETITEMCOUNT 메시지를 컨트롤에 보낼 수 있습니다. 이 메시지를 사용하면 목록 뷰 컨트롤이 항목을 추가할 때마다가 아니라 한 번만 내부 데이터 구조체를 다시 할당할 수 있습니다. LVM_GETITEMCOUNT 메시지를 사용하여 목록 뷰 컨트롤의 항목 수를 확인할 수 있습니다. 목록 뷰 컨트롤에 많은 수의 항목을 추가하는 경우 항목을 추가하기 전에 다시 그리기를 사용하지 않도록 설정하여 프로세스 속도를 높일 수 있습니다. 그런 다음 항목이 추가된 후 다시 그리기를 사용하도록 설정할 수 있습니다. WM_SETREDRAW 메시지를 사용하여 다시 그리기를 사용하거나 사용하지 않도록 설정합니다.

목록 뷰 항목의 특성을 변경하려면 LVM_SETITEM 메시지를 사용하여 LVITEM 구조체의 주소를 지정합니다. 이 구조체의 mask 멤버는 변경할 항목 특성을 지정합니다. 예를 들어 항목 또는 하위 항목의 텍스트만 변경하려면 LVM_SETITEMTEXT 메시지를 사용합니다.

목록 뷰 항목에 대한 정보를 검색하려면 LVM_GETITEM 메시지를 사용하여 채울 LVITEM 구조체의 주소를 지정합니다. 이 구조체의 mask 멤버는 검색할 항목 특성을 지정합니다. 항목 또는 하위 항목의 텍스트만 검색하려면 LVM_GETITEMTEXT 메시지를 사용합니다.

목록 뷰 항목을 삭제하려면 LVM_DELETEITEM 메시지를 사용합니다. LVM_DELETEALLITEMS 메시지를 사용하여 목록 뷰 컨트롤의 모든 항목을 삭제할 수 있습니다.

목록 뷰 항목 상태

항목의 상태는 항목의 가용성을 지정하거나, 사용자 작업을 나타내거나, 그렇지 않으면 항목의 상태를 반영하는 값입니다. 목록 뷰 컨트롤은 사용자가 항목을 선택하는 경우와 같은 일부 상태 비트를 변경합니다. 애플리케이션은 다른 상태 비트를 변경하여 항목을 사용하지 않도록 설정하거나 숨기거나 오버레이 이미지 또는 상태 이미지를 지정할 수 있습니다. 오버레이 이미지 및 상태 이미지에 대한 자세한 내용은 목록 뷰 이미지 목록을 참조하세요.

항목의 상태는 LVITEM 구조체의 상태 멤버에 의해 지정됩니다. 항목의 상태를 지정하거나 변경할 때 stateMask 멤버는 변경해야 하는 상태 비트를 지정합니다. LVM_SETITEMSTATE 메시지를 사용하여 항목의 상태를 변경할 수 있습니다. 항목을 만들 때 또는 LVM_SETITEM 메시지를 사용하여 특성을 변경할 때 항목의 상태를 지정할 수 있습니다. 항목의 현재 상태를 확인하려면 LVM_GETITEMSTATE 또는 LVM_GETITEM 메시지를 사용합니다.

항목의 오버레이 이미지를 설정하려면 LVITEM 구조체의 stateMask 멤버에 LVIS_OVERLAYMASK 값이 포함되어야 하며, state 멤버는 INDEXTOOVERLAYMASK 매크로를 사용하여 왼쪽으로 8비트 이동한 오버레이 이미지의 1부터 시작하는 인덱스를 포함해야 합니다. 인덱스가 0이면 오버레이 이미지가 지정되지 않습니다.

항목의 상태 이미지를 설정하려면 LVITEM 구조체의 stateMask 멤버에 LVIS_STATEIMAGEMASK 값이 포함되어야 하며, state 멤버는 INDEXTOSTATEIMAGEMASK 매크로를 사용하여 왼쪽으로 12비트 이동한 상태 이미지의 1부터 시작하는 인덱스를 포함해야 합니다. 인덱스가 0이면 상태 이미지가 지정되지 않습니다.

콜백 항목 및 콜백 마스크

각 항목에 대해 목록 뷰 컨트롤은 일반적으로 레이블 텍스트, 항목 아이콘의 이미지 목록 인덱스 및 항목 상태에 대한 비트 플래그 집합을 저장합니다. 콜백 항목을 정의하거나 컨트롤의 콜백 마스크를 변경하여 컨트롤이 아닌 애플리케이션이 이 정보의 일부 또는 전부를 저장함을 나타낼 수 있습니다. 애플리케이션에서 이 정보 중 일부를 저장하는 경우 콜백을 사용하고 싶을 수 있습니다.

목록 뷰 컨트롤의 콜백 항목은 애플리케이션이 텍스트나 아이콘 인덱스 또는 둘 다를 저장하기 위한 항목입니다. 목록 뷰 컨트롤에 항목을 추가하기 위해 LVM_INSERTITEM 메시지를 보낼 때 콜백 항목을 정의할 수 있습니다. 애플리케이션이 항목 또는 하위 항목에 대한 텍스트를 저장하는 경우 항목의 LVITEM 구조체의 pszText 멤버를 LPSTR_TEXTCALLBACK에 설정합니다. 애플리케이션에서 항목에 대한 아이콘 인덱스를 저장하는 경우 항목 LVITEM 구조체의 iImage 멤버를 I_IMAGECALLBACK에 설정합니다.

list-view 컨트롤의 콜백 마스크는 컨트롤이 아닌 애플리케이션이 현재 데이터를 저장하기 위한 항목 상태를 지정하는 비트 플래그 집합입니다. 콜백 마스크는 특정 항목에 적용되는 콜백 항목 지정과 달리 컨트롤의 모든 항목에 적용됩니다. 콜백 마스크는 기본적으로 0입니다. 즉, 목록 뷰 컨트롤은 모든 항목 상태 정보를 저장합니다. 목록 뷰 컨트롤을 만들고 해당 항목을 초기화한 후 LVM_SETCALLBACKMASK 메시지를 보내 콜백 마스크를 변경할 수 있습니다. 현재 콜백 마스크를 검색하려면 LVM_GETCALLBACKMASK 메시지를 보냅니다.

목록 뷰 컨트롤이 애플리케이션에서 콜백 정보를 저장하는 목록 뷰 항목을 표시하거나 정렬해야 하는 경우 컨트롤은 LVN_GETDISPINFO 알림 코드를 컨트롤의 부모 창으로 보냅니다. 이 메시지는 필요한 정보 유형을 포함하고 검색할 항목 또는 하위 항목을 식별하는 NMLVDISPINFO 구조체를 지정합니다. 부모 창은 요청된 데이터를 제공하기 위해 LVN_GETDISPINFO를 처리해야 합니다.

목록 뷰 컨트롤이 텍스트, 아이콘 또는 상태 정보의 변경과 같은 항목의 콜백 정보 변경을 감지하는 경우 컨트롤은 변경 내용을 알리는 LVN_SETDISPINFO 알림 코드를 보냅니다.

콜백 항목의 특성 또는 상태 비트를 변경하는 경우 LVM_UPDATE 메시지를 사용하여 컨트롤이 항목을 다시 그리도록 합니다. 또한 이 메시지는 컨트롤에 LVS_AUTOARRANGE 스타일이 있는 경우 해당 항목을 정렬하도록 합니다. LVM_REDRAWITEMS 메시지를 사용하여 목록 뷰 컨트롤의 클라이언트 영역의 해당 부분을 무효화하여 항목 범위를 다시 그릴 수 있습니다.

콜백 항목과 콜백 마스크를 효과적으로 사용하면 각 항목 특성이 한 곳에서만 유지 관리되도록 할 수 있습니다. 이렇게 하면 애플리케이션이 간소화될 수 있지만 저장되는 유일한 공간은 항목 레이블 및 하위 항목 텍스트를 저장하는 데 필요한 메모리뿐입니다.

목록 뷰 항목 위치

모든 목록 뷰 항목에는 메시지를 사용하여 검색하고 설정할 수 있는 위치와 크기가 있습니다. 지정된 위치에 있는 항목(있는 경우)을 확인할 수도 있습니다. 목록 뷰 항목의 위치는 뷰 좌표에 지정되며, 이는 스크롤 위치에 의해 오프셋되는 클라이언트 좌표입니다.

항목의 위치를 검색하고 설정하려면 LVM_GETITEMPOSITIONLVM_SETITEMPOSITION 메시지를 사용합니다. LVM_GETITEMPOSITION은 모든 뷰에서 작동하지만 LVM_SETITEMPOSITION는 아이콘 및 작은 아이콘 뷰에서만 작동합니다.

LVM_HITTEST 메시지를 사용하여 특정 위치에 있는 항목(있는 경우)을 확인할 수 있습니다.

목록 항목에 대해서 또는 해당 아이콘이나 레이블에 대해서만 경계 사각형을 검색하려면 LVM_GETITEMRECT 메시지를 사용합니다.

항목 정렬, 분류 및 찾기

목록 뷰 메시지를 사용하여 항목을 배열 및 정렬하고 특성 또는 위치에 따라 항목을 찾을 수 있습니다. 정렬하면 항목의 위치가 눈금에 맞춰지지만 항목의 인덱스는 변경되지 않습니다. 정렬하면 항목의 시퀀스(및 해당 인덱스)가 변경된 다음 그에 따라 위치가 변경됩니다. 아이콘 및 작은 아이콘 뷰에서만 항목을 정렬할 수 있지만 모든 뷰에서 항목을 정렬할 수 있습니다. 항목을 찾으려면 항목 위치 또는 속성을 지정하는 목록 뷰 메시지를 보냅니다.

항목을 정렬하려면 LVM_ARRANGE 메시지를 사용합니다. LVS_AUTOARRANGE 창 스타일을 지정하여 항목이 항상 정렬되도록 할 수 있습니다.

항목을 분류하려면 LVM_SORTITEMS 메시지를 사용합니다. 이 메시지를 사용하여 분류할 때 목록 뷰 컨트롤이 호출하는 애플리케이션 정의 콜백 함수를 지정하여 두 항목의 상대 순서를 비교합니다. 컨트롤은 비교 함수에 두 항목 각각과 연결된 항목 데이터를 전달합니다. 항목 데이터는 항목의 LVITEM 구조체가 목록에 삽입될 때 lParam 멤버에 지정된 값입니다. 적절한 항목 데이터를 지정하고 적절한 비교 함수를 제공하면 해당 레이블, 하위 항목 또는 다른 속성별로 항목을 분류할 수 있습니다. 항목을 정렬하면 해당 하위 항목의 순서를 다시 지정하지 않습니다. 항목의 순서를 다시 지정하면 해당 하위 항목이 해당 항목과 함께 전달됩니다. 즉, 전체 행이 함께 유지됩니다. 별도로 열의 순서를 정하고 항목에서 하위 항목을 분리하려면 LVM_SETITEM을 사용하여 정렬한 후 열을 다시 생성해야 합니다.

LVS_SORTASCENDING 또는 LVS_SORTDESCENDING 창 스타일을 지정하여 목록 뷰 컨트롤이 항상 정렬되도록 할 수 있습니다. 이러한 스타일을 사용하는 컨트롤은 항목의 레이블 텍스트를 사용하여 오름차순 또는 내림차순으로 정렬합니다. 이러한 창 스타일을 사용하는 경우 비교 함수를 제공할 수 없습니다. 목록 뷰 컨트롤에 이러한 스타일 중 하나가 있는 경우 LPSTR_TEXTCALLBACK이 있는 항목을 LVITEM 구조체의 pszText 멤버로 삽입하려고 하면 LVM_INSERTITEM 메시지가 실패합니다.

LVM_FINDITEM 메시지를 사용하여 특정 속성이 있는 목록 뷰 항목을 찾을 수 있습니다. LVM_GETNEXTITEM 메시지를 사용하여 지정된 상태이고 지정된 항목과 지정된 관계가 있는 목록 뷰 항목을 찾을 수 있습니다. 예를 들어 지정된 항목의 오른쪽에 있는 다음 선택한 항목을 검색할 수 있습니다.

목록 뷰 열

열은 항목 및 해당 하위 항목이 보고서 뷰에 표시되는 방식을 제어합니다. 각 열에는 제목과 너비가 있으며 특정 하위 항목과 연결됩니다. 하위 항목 0은 항목의 아이콘 및 레이블입니다. 열의 특성은 LVCOLUMN 구조체로 정의됩니다.

목록 뷰 컨트롤에 열을 추가하려면 LVM_INSERTCOLUMN 메시지를 사용합니다. 열을 삭제하려면 LVM_DELETECOLUMN 메시지를 사용합니다.

참고

목록 뷰 컨트롤의 열 0 삭제는 ComCtl32.dll 버전 6 이상에서만 지원됩니다. 버전 5에서도 열 0 삭제를 지원하지만 CCM_SETVERSION을 사용하여 버전을 5 이상으로 설정한 후에만 가능합니다. 버전 5 이전 버전은 열 0 삭제를 지원하지 않습니다.

 

LVM_GETCOLUMNLVM_SETCOLUMN 메시지를 사용하여 기존 열의 속성을 검색하고 변경할 수 있습니다. 열의 너비를 검색하거나 변경하려면 LVM_GETCOLUMNWIDTHLVM_SETCOLUMNWIDTH를 사용합니다.

LVS_NOCOLUMNHEADER 창 스타일을 지정하지 않으면 열 머리글이 보고서 뷰에 표시됩니다. 사용자가 열 머리글을 클릭하면 LVN_COLUMNCLICK 알림 코드가 부모 창으로 전송됩니다. 일반적으로 부모 창은 이 클릭이 발생할 때 지정된 열을 기준으로 목록 뷰 컨트롤을 정렬합니다. 사용자는 머리글 간에 열 안내선을 끌어 열 크기를 조정할 수도 있습니다.

목록 뷰 컨트롤은 열 제목 옆에 이미지를 표시할 수 있습니다. 이 기능을 구현하려면 LVCF_IMAGE 값을 지정하고 이미지의 인덱스 를 LVCOLUMN 구조체의 iImage 멤버에 할당합니다.

목록 뷰 컨트롤은 열이 표시되는 순서를 설정할 수 있습니다. 이 기능을 구현하려면 LVCF_ORDER 값을 지정하고 LVCOLUMN 구조체의 iOrder 멤버에 열 순서를 할당합니다. 열 순서는 0부터 시작하며 왼쪽에서 오른쪽 순서로 표시됩니다. 예를 들어 0은 맨 왼쪽 열을 나타냅니다.

목록 뷰 스크롤 위치

LVS_NOSCROLL 창 스타일을 지정하지 않으면 목록 뷰 컨트롤을 스크롤하여 컨트롤의 클라이언트 영역에 들어갈 수 있는 것보다 많은 항목을 표시할 수 있습니다. 목록 뷰 컨트롤의 스크롤 위치 및 관련 정보를 검색하거나, 지정된 양만큼 목록 뷰 컨트롤을 스크롤하거나, 목록 뷰 컨트롤을 스크롤하여 지정된 목록 항목이 표시되도록 할 수 있습니다.

아이콘 뷰 또는 작은 아이콘 뷰에서 현재 스크롤 위치는 뷰 원점에서 정의됩니다. 뷰 원점은 뷰 좌표(0, 0)에 해당하는 목록 뷰 컨트롤의 표시 영역이 기준인 좌표 집합입니다. 현재 뷰 원점을 검색하려면 LVM_GETORIGIN 메시지를 사용합니다. 이 메시지는 아이콘 또는 작은 아이콘 뷰에서만 사용해야 합니다. 목록 또는 보고서 뷰에서 오류를 반환합니다.

목록 또는 보고서 뷰에서 현재 스크롤 위치는 상위 인덱스로 정의됩니다. 상위 인덱스는 목록 뷰 컨트롤에서 처음 표시되는 항목의 인덱스입니다. 현재 상위 인덱스 검색하려면 LVM_GETTOPINDEX 메시지를 사용합니다. 이 메시지는 목록 또는 보고서 뷰에서만 유효한 결과를 반환합니다. 아이콘 또는 작은 아이콘 뷰에서는 0을 반환합니다.

LVM_GETVIEWRECT 메시지를 사용하여 컨트롤의 표시 영역을 기준으로 목록 뷰 컨트롤에 있는 모든 항목의 경계 사각형을 검색할 수 있습니다.

LVM_GETCOUNTPERPAGE 메시지는 목록 뷰 컨트롤의 한 페이지에 맞는 항목 수를 반환합니다. 이 메시지는 목록 및 보고서 뷰에서만 유효한 결과를 반환합니다. 아이콘 및 작은 아이콘 뷰에서 총 항목 수를 반환합니다.

목록 뷰 컨트롤을 특정 크기만큼 스크롤하려면 LVM_SCROLL 메시지를 사용합니다. LVM_ENSUREVISIBLE 메시지를 사용하여 필요한 경우 목록 뷰 컨트롤을 스크롤하여 지정된 항목이 표시되도록 할 수 있습니다.

목록 뷰 레이블 편집

LVS_EDITLABELS 창 스타일이 있는 목록 뷰 컨트롤을 사용하면 사용자가 항목 레이블을 현재 위치에 편집할 수 있습니다. 사용자는 포커스가 있는 항목의 레이블을 클릭하여 편집을 시작합니다. 또는 애플리케이션은 LVM_EDITLABEL 메시지를 사용하여 자동으로 편집을 시작할 수 있습니다. 목록 뷰 컨트롤은 편집이 시작될 때와 취소 또는 완료될 때 부모 창에 알립니다. 편집이 완료되면 부모 창은 적절한 경우 항목의 레이블 업데이트를 담당합니다.

레이블 편집이 시작되면 편집 컨트롤이 만들기, 배치 및 초기화됩니다. 표시되기 전에 목록 뷰 컨트롤은 부모 창에 LVN_BEGINLABELEDIT 알림 코드를 보냅니다. 레이블 편집 프로세스를 수정해야 하는 경우 이 알림에 대한 처리기를 구현할 수 있습니다.

LVN_BEGINLABELEDIT 알림 처리기의 한 가지 용도는 사용자가 편집할 수 있는 레이블을 제어하는 것입니다. 레이블 편집을 방지하려면 0이 아닌 값을 반환합니다. 레이블 편집을 사용자 지정하려면 알림 처리기가 목록 뷰 컨트롤에 LVM_GETEDITCONTROL 메시지를 전송하여 편집 컨트롤에 대한 핸들을 검색하도록 합니다. 해당 핸들이 있으면 일반적인 EM_XXX 메시지를 보내 편집 컨트롤을 사용자 지정할 수 있습니다. 예를 들어 사용자가 입력할 수 있는 텍스트의 양을 제한하려면 편집 컨트롤에 EM_LIMITTEXT 메시지를 보냅니다. SetWindowText를 사용하여 편집 컨트롤의 기본 텍스트를 변경할 수 있습니다. 편집 컨트롤을 서브클래스하여 잘못된 문자를 가로채고 삭제할 수도 있습니다.

레이블 편집이 취소되거나 완료되면 목록 뷰 컨트롤이 부모 창에 LVN_ENDLABELEDIT 알림 메시지를 보냅니다. lParam 매개 변수는 NMLVDISPINFO 구조체의 주소입니다. 이 구조체의 item 멤버는 iItem 멤버가 항목을 식별하는 LVITEM 구조체입니다. 편집이 취소된 경우 LVITEM 구조체의 pszText 멤버는 NULL입니다. 그렇지 않으면 pszText는 편집된 텍스트의 주소입니다. 부모 창은 새 레이블을 유지하려는 경우 항목의 레이블을 업데이트해야 합니다.

목록 뷰 색

애플리케이션은 목록 뷰 컨트롤에 대해 세 가지 색을 검색하고 설정할 수 있습니다.

색을 검색하고 설정하는 데 사용되는 메시지
텍스트 색 LVM_GETTEXTCOLOR, LVM_SETTEXTCOLOR
텍스트 배경색 LVM_GETTEXTBKCOLOR, LVM_SETTEXTBKCOLOR
창 배경색 LVM_GETBKCOLOR, LVM_SETBKCOLOR

 

목록 뷰 컨트롤의 모양을 더 눈에 띄게 사용자 지정하려면 NM_CUSTOMDRAW(목록 뷰)를 사용하거나 시각적 스타일을 사용합니다(시각적 스타일시각적 스타일 사용 참조).

그룹별 목록 항목 정렬

목록 뷰 컨트롤의 그룹화 기능을 사용하면 논리적으로 관련된 항목 집합을 시각적으로 그룹화할 수 있습니다. 항목 속성, 특성 또는 기타 특성에 따라 그룹을 만들 수 있습니다. 이러한 그룹은 일반적으로 화면에서 그룹의 이름을 포함하는 가로 머리글로 구분됩니다. 다음 스크린샷은 그룹화된 항목을 보여줍니다.

screen shot of a list-view control, with dogs in one group and cats in another group

LVGROUP 구조체를 사용하여 머리글 및 바닥글 텍스트, 그룹의 현재 상태 등과 같은 그룹에 대한 정보를 저장합니다. 그룹화 API에는 그룹에 항목을 추가하고, 뷰에 그룹을 추가하고, 그룹 항목을 정렬하고, 항목 크기 및 기타 정보에 대한 그룹을 쿼리하여 그룹 및 그룹 요소를 관리할 수 있는 메시지가 포함됩니다. 예를 들어 ListView_SetGroupMetricsListView_GetGroupMetrics 매크로를 사용하여 각 그룹에 대한 표시 매개 변수를 설정하고 검색할 수 있습니다.

그룹화는 목록 뷰를 제외한 모든 뷰에서 사용할 수 있습니다. LVS_OWNERDATA 스타일이 있는 컨트롤에서는 사용할 수 없습니다.

자세한 내용은 목록 뷰 컨트롤 사용을 참조하세요.

삽입 표시

삽입 표시는 끌어온 항목이 배치되는 위치를 사용자에게 표시합니다. 삽입 표시는 현재 사용자가 항목을 시작 메뉴 또는 빠른 실행 표시줄로 끌 때 표시됩니다. 삽입 표시는 자동 정렬로 설정된 목록에 대해서도 작동합니다. 사용자가 다른 두 항목 사이의 지점으로 항목을 끌면 삽입 표시가 항목의 새 예상 위치를 보여 줍니다. 다음 스크린샷에는 삽입 표시가 나와 있습니다.

screen shot that shows an insertion mark when dragging one file between two others in a list-view control

삽입 표시 API 요소는 적중 검색을 수행하고, 항목별로 삽입 표시의 위치와 모양을 지정하고, 삽입 표시의 현재 크기와 모양에 대한 정보를 쿼리하는 메시지와 플래그를 제공하여 삽입 표시를 배치할 수 있습니다.

추가 정보