List-View 컨트롤에 대한 정보
Virtual listview 컨트롤 샘플참조하세요.
목록 보기 컨트롤은 항목 컬렉션을 표시하는 창입니다. 목록 보기 컨트롤은 항목을 정렬하고 표시하는 여러 가지 방법을 제공하며 간단한 목록 상자 훨씬 더 유연합니다. 예를 들어 각 항목에 대한 추가 정보를 아이콘 및 레이블 오른쪽의 열에 표시할 수 있습니다.
- List-View 스타일 및 뷰
- 가상 List-View 스타일
- List-View 작업 영역
- List-View 이미지 목록
- 항목 및 하위 항목 List-View
- List-View 열
- List-View 스크롤 위치
- List-View 레이블 편집
- List-View 색상
- 그룹으로 목록 항목 정렬
- 삽입 표시
List-View 스타일과 보기
목록 보기 컨트롤은 다섯 가지 보기로 항목을 표시할 수 있습니다. 컨트롤의 창 스타일은 기본 보기를 지정합니다. 추가 창 스타일은 항목의 맞춤 및 컨트롤 관련 기능을 지정합니다. 다음 표는 뷰를 설명합니다.
뷰 이름 | 묘사 |
---|---|
아이콘 보기 | LVS_ICON 창 스타일 또는 LVM_SETVIEW 메시지와 함께 LV_VIEW_ICON 전달하여 지정됩니다. 각 항목은 아래에 레이블이 있는 전체 크기 아이콘으로 표시됩니다. 사용자는 목록 보기 창의 모든 위치로 항목을 끌 수 있습니다. |
작은 아이콘 보기 | LVS_SMALLICON 창 스타일로 설정하거나 LVM_SETVIEW에 LV_VIEW_SMALLICON를 전달하여 지정됩니다. 각 항목은 오른쪽에 레이블이 있는 작은 아이콘으로 나타납니다. 사용자는 항목을 모든 위치로 끌 수 있습니다. |
목록 보기 | LVS_LIST 창 스타일 또는 LV_VIEW_LIST 와 함께 LVM_SETVIEW를 전달하여 지정합니다. 각 항목은 오른쪽에 레이블이 있는 작은 아이콘으로 나타납니다. 항목은 열로 정렬되며 사용자는 임의의 위치로 끌어다 놓을 수 없습니다. |
보고서(세부 정보) 보기 | LVS_REPORT 창 스타일로 또는 LV_VIEW_DETAILS와 함께 LVM_SETVIEW을 전달하여 지정됩니다. 각 항목은 열에 정렬된 정보와 함께 고유한 줄에 나타납니다. 왼쪽 첫 번째 열은 항상 왼쪽 정렬되며, 작은 아이콘과 레이블을 포함합니다. 후속 열에는 애플리케이션에서 지정한 하위 항목이 포함됩니다. LVS_NOCOLUMNHEADER 창 스타일을 지정하지 않는 한 각 열에는 머리글이 있습니다. |
타일 보기 | 버전 6 이상. LV_VIEW_TILE를 LVM_SETVIEW에 전달하여 지정됩니다. 각 항목은 하나 이상의 줄 옆에 레이블이 있는 전체 크기 아이콘으로 표시됩니다. |
다음 스크린샷은 보기를 사용하여 7마리의 애완 동물 각각에 대한 다양한 양의 정보를 표시합니다. 보기는 Windows Vista에 정보가 표시되는 방법을 보여 줍니다. 컨트롤의 비주얼 스타일은 SetWindowTheme사용하여 "탐색기" 테마로 설정되었습니다.
다음 스크린샷은 세부 정보 보기를 보여줍니다.
다음 스크린샷은 아이콘 보기를 보여줍니다.
각 애완 동물의 이름과 종스크린샷
다음 스크린샷은 목록 보기를 보여줍니다.
다음 스크린샷은 타일 보기를 보여줍니다.
목록 보기 컨트롤을 만든 후 보기 유형을 변경할 수 있습니다. 창 스타일을 검색하고 변경하려면 GetWindowLong 및 setWindowLong함수를사용합니다. 현재 보기의 창 스타일을 확인하려면 LVS_TYPEMASK 값을 사용합니다.
LVS_ALIGNTOP(기본값) 또는 LVS_ALIGNLEFT 창 스타일을 지정하여 아이콘 또는 작은 아이콘 보기에서 항목이 정렬되는 방식을 제어할 수 있습니다.
목록 보기 컨트롤을 만든 후 맞춤을 변경할 수 있습니다. 현재 맞춤을 확인하려면 LVS_ALIGNMASK 값을 사용합니다.
추가 창 스타일은 사용자가 레이블을 편집하거나 한 번에 둘 이상의 항목을 선택할 수 있는지 여부와 같은 다른 옵션을 제공합니다. 전체 목록은 List-View 창 스타일참조하세요.
확장 List-View 스타일
확장된 목록 보기 컨트롤 스타일은 확인란, 플랫 스크롤 막대, 눈금선 및 핫 트래킹과 같은 옵션을 제공합니다. 완전한 목록을 보려면 확장 List-View 스타일을(를) 참조하세요. 표준 창 스타일과 동일한 방식으로 확장된 목록 보기 스타일에 액세스하지 않습니다. GetWindowLong 및 SetWindowLong 함수를 사용하여 확장 스타일을 변경하지 않습니다.
LVM_SETEXTENDEDLISTVIEWSTYLE 및 LVM_GETEXTENDEDLISTVIEWSTYLE확장 스타일 정보를 설정하고 검색하는 두 개의 메시지가 있습니다. 메시지를 명시적으로 보내는 대신 해당 매크로인 ListView_SetExtendedListViewStyle, ListView_SetExtendedListViewStyleEx및 ListView_GetExtendedListViewStyle사용할 수 있습니다.
가상 List-View 스타일
가상 목록 보기는 LVS_OWNERDATA 스타일을 가진 목록 보기 컨트롤입니다. 이 스타일을 사용하면 소유자가 항목 데이터 관리 부담을 받기 때문에 컨트롤에서 수백만 개의 항목을 처리할 수 있습니다. 이렇게 하면 특정 데이터 액세스 방법이 이미 있는 대규모 정보 데이터베이스에서 가상 목록 보기 컨트롤을 사용할 수 있습니다.
가상 목록 보기 컨트롤은 항목 정보 자체를 거의 유지하지 않습니다. 항목 선택 및 포커스 정보를 제외하고 컨트롤의 소유자는 모든 항목 정보를 관리해야 합니다. 다른 프로세스는 LVN_GETDISPINFO 알림 코드를 사용하여 소유자로부터 항목 정보를 요청합니다.
이 유형의 목록 컨트롤은 큰 데이터 집합을 위한 것이므로 검색 성능을 향상시키기 위해 요청된 항목 데이터를 캐시하는 것이 좋습니다. 목록 보기는 캐시 최적화를 지원하는 캐시 힌트 메커니즘을 제공합니다. 힌트는 LVN_ODCACHEHINT 알림 코드 형식으로 구현됩니다.
가상 List-View 컨트롤 만들기
CreateWindow 또는 CreateWindowEx 함수를 사용하여 가상 목록 보기 컨트롤을 만들고 dwStyle 함수 매개 변수의 일부로 LVS_OWNERDATA 창 스타일을 지정합니다. LVS_OWNERDATA 스타일과 동적으로 전환하는 것은 지원되지 않습니다.
LVS_SORTASCENDING 또는 LVS_SORTDESCENDING 스타일을 제외한 대부분의 다른 창 스타일과 함께 LVS_OWNERDATA 스타일을 사용할 수 있습니다. 모든 가상 목록 보기 컨트롤은 기본적으로 LVS_AUTOARRANGE 스타일입니다.
목록에 항목을 표시할 수 있도록 하려면 먼저 명시적으로 또는 ListView_SetItemCountEx 매크로를 사용하여 LVM_SETITEMCOUNT 메시지를 보내야 합니다.
다음 메시지는 LVS_OWNERDATA 스타일에서는 지원되지 않습니다: LVM_ENABLEGROUPVIEW, LVM_GETITEMTEXT, LVM_SETTILEINFO및 LVM_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 | 지원되지 않습니다. 원하는 순서로 항목을 표시하는 것은 애플리케이션의 책임입니다. |
가상 List-View 제어 알림 코드 처리
LVS_OWNERDATA 스타일을 사용하는 목록 보기 컨트롤은 다른 목록 보기 컨트롤과 동일한 알림 코드를 보내고 LVN_ODCACHEHINT 및 LVN_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 구조에는 필요한 항목 범위의 포괄 엔드포인트를 나타내는 iFrom 및 iTo 두 개의 정수 멤버가 포함됩니다. 소유자는 권장 범위 내의 각 항목에 대한 항목 정보와 함께 캐시를 로드할 준비를 해야 합니다.
목록 컨트롤에는 종종 첫 번째 항목(오프셋 0)에 대한 항목 정보가 필요합니다. LVN_ODCACHEHINT 알림 코드에 항상 항목 0이 포함되지는 않지만 항상 캐시에 포함되어야 합니다.
목록의 마지막 항목은 자주 액세스됩니다. 따라서 소유자는 목록의 끝에 있는 항목을 포함하는 두 번째 캐시를 유지할 수 있습니다. 요청된 범위는 LVN_ODCACHEHINT 끝 캐시에 대해 확인하여, 동일한 끝 범위를 매번 다시 로드할 필요 없이 자동으로 사용할 수 있도록 할 수 있습니다.
List-View 작업 영역
목록 보기 컨트롤은 목록 보기 컨트롤이 항목을 정렬하는 데 사용하는 직사각형 가상 영역인 작업 영역을 지원합니다. 작업 영역은 창이 아니고 표시되는 테두리를 가질 수 없습니다. 기본적으로 목록 보기 컨트롤에는 작업 영역이 없습니다. 작업 영역을 만들면 항목의 왼쪽, 위쪽 또는 오른쪽에 빈 테두리를 만들거나 일반적으로 테두리가 없을 때 가로 스크롤 막대가 표시되도록 할 수 있습니다.
작업 영역을 만들면 작업 영역 내에 있는 항목이 작업 영역의 구성원이 됩니다. 마찬가지로 항목이 작업 영역으로 이동되면 해당 항목은 해당 작업 영역의 멤버가 됩니다. 항목이 작업 영역 내에 있지 않으면 자동으로 첫 번째(인덱스 0) 작업 영역의 멤버가 됩니다. 특정 작업 영역 내에 새 항목을 배치하려면 먼저 항목을 만든 다음 LVM_SETITEMPOSITION 또는 LVM_SETITEMPOSITION32 메시지를 사용하여 원하는 작업 영역으로 이동해야 합니다.
다음 그림은 각각 클라이언트 영역의 다른 사분면에 있는 4개의 작업 영역을 포함하는 목록 보기 컨트롤의 예입니다.
클라이언트 영역의 각 사분면에 하나의 작업 영역이 있는 목록 보기 컨트롤의 스크린샷
하나의 보기 내에서 다른 영역을 만드는 데 여러 작업 영역을 사용할 수 있습니다. 의미가 다른 단일 보기에서 영역을 만들 수 있습니다. 예를 들어 파일 시스템의 보기에는 읽기/쓰기 파일에 대한 영역과 읽기 전용 파일의 다른 영역이 있을 수 있습니다. 사용자는 항목을 다른 작업 영역에 배치하여 분류할 수 있습니다. 파일이 읽기 전용 영역으로 이동되면 자동으로 읽기 전용이 됩니다.
여러 작업 영역이 교차할 수 있지만 교집합 내에 있는 항목은 인덱스가 낮은 영역의 멤버가 됩니다. 따라서 이 상황을 피하는 것이 가장 좋습니다. 여러 작업 영역을 정렬할 때 항목은 동일한 작업 영역의 다른 항목과 비교하여 정렬됩니다.
작업 영역 수는 LVM_GETNUMBEROFWORKAREAS 메시지와 함께 검색할 수 있습니다. 작업 영역은 LVM_SETWORKAREAS 메시지와 함께 변경되며 LVM_GETWORKAREAS 메시지와 함께 검색할 수 있습니다. 두 메시지는 모두 lParam으로 RECT 구조체 배열의 주소를, wParam으로 RECT 구조체의 수를 사용합니다. 이러한 구조체의 왼쪽위쪽 멤버는 작업 영역의 왼쪽 위 모서리(원점)의 좌표를 지정하고, 오른쪽 및 아래쪽 멤버는 작업 영역의 오른쪽 아래 모서리를 지정합니다. 모든 좌표는 목록 보기의 클라이언트 좌표에 있습니다. 허용되는 최대 작업 영역 수는 LV_MAX_WORKAREAS 값으로 정의됩니다.
작업 영역을 변경해도 LVS_LIST 또는 LVS_REPORT 보기가 있는 목록 보기 컨트롤에는 영향을 주지 않지만 보기 유형이 변경되면 작업 영역이 유지됩니다. LVS_ICON 및 LVS_SMALLICON 보기를 사용하면 작업 영역을 수정하여 항목이 표시되는 방식을 변경할 수 있습니다. 작업 영역의 너비(오른쪽 - 왼쪽)를 컨트롤의 클라이언트 너비보다 크게 지정하면 항목이 해당 너비로 래핑되고 가로 스크롤 막대가 표시됩니다. 작업 영역의 너비를 컨트롤의 클라이언트 영역 너비보다 좁게 만들면 항목이 클라이언트 영역이 아닌 작업 영역 내에 래핑됩니다. 왼쪽 또는 위쪽 멤버를 양수 값으로 설정하면 작업 영역에서 시작하여 컨트롤 가장자리와 항목 사이에 빈 공간이 만들어집니다. 작업 영역의 너비를 컨트롤의 클라이언트 너비보다 작게 만들어 컨트롤의 오른쪽 가장자리와 항목 사이에 빈 공간을 만들 수도 있습니다.
List-View 이미지 목록
기본적으로 목록 보기 컨트롤은 항목 이미지를 표시하지 않습니다. 항목 이미지를 표시하려면 이미지 목록을 만들고 컨트롤과 연결해야 합니다. 목록 보기 컨트롤에는 다음 세 개의 이미지 목록이 있을 수 있습니다.
- 컨트롤이 아이콘 보기에 있을 때 표시되는 전체 크기 아이콘이 포함된 이미지 목록입니다.
- 컨트롤이 작은 아이콘 보기, 목록 보기 또는 보고서 보기에 있을 때 표시되는 작은 아이콘을 포함하는 이미지 목록입니다.
- 전체 크기 또는 작은 아이콘의 왼쪽에 표시되는 상태 이미지를 포함하는 이미지 목록입니다. 선택 및 선택 취소된 확인란과 같은 상태 이미지를 사용하여 애플리케이션 정의 항목 상태를 나타낼 수 있습니다. 상태 이미지는 아이콘 보기, 작은 아이콘 보기, 목록 보기 및 보고서 보기에 표시됩니다.
전체 크기 및 작은 아이콘 이미지 목록에는 항목 아이콘 위에 투명하게 그려지도록 설계된 오버레이 이미지포함될 수도 있습니다.
목록 보기 컨트롤에서 오버레이 이미지를 사용하려면 다음을 수행합니다.
- ImageList_SetOverlayImage 함수를 호출하여 전체 크기 및 작은 아이콘 이미지 목록의 이미지에 오버레이 이미지 인덱스 할당 오버레이 이미지는 1부터 시작하는 인덱스로 식별됩니다.
- ListView_InsertItem 또는 ListView_SetItem 매크로를 호출할 때 오버레이 이미지 인덱스와 항목을 연결할 수 있습니다. INDEXTOOVERLAYMASK 매크로를 사용하여 항목의 LVITEM 구조체의 상태 멤버에 오버레이 이미지 인덱스를 지정합니다. 또한 stateMask 멤버에서 LVIS_OVERLAYMASK 비트를 설정해야 합니다.
상태 이미지 목록을 지정 하는 경우 목록 보기 컨트롤은 상태 이미지에 대 한 각 항목의 아이콘 왼쪽에 공간을 예약 합니다.
상태 이미지를 항목과 연결하려면 INDEXTOSTATEIMAGEMASK 매크로를 사용하여 LVITEM 구조체의 상태 멤버에서 상태 이미지 인덱스를 지정합니다. 인덱스는 컨트롤의 상태 이미지 목록에서 이미지를 식별합니다. 이미지 목록 인덱스가 0부터 시작하는 경우 컨트롤은 1부터 시작하는 인덱스를 사용하여 상태 이미지를 식별합니다. 상태 이미지 인덱스가 0이면 항목에 상태 이미지가 없음을 나타냅니다.
기본적으로 목록 보기 컨트롤이 제거되면 할당된 이미지 목록이 삭제됩니다. 그러나 목록 보기 컨트롤에 LVS_SHAREIMAGELISTS 창 스타일이 있는 경우 애플리케이션은 더 이상 사용하지 않을 때 이미지 목록을 삭제해야 합니다. 여러 목록 보기 컨트롤에 동일한 이미지 목록을 할당하는 경우 이 스타일을 지정해야 합니다. 그렇지 않으면 둘 이상의 컨트롤이 동일한 이미지 목록을 삭제하려고 할 수 있습니다.
항목 및 하위 항목 List-View
목록 보기 컨트롤의 각 항목에는 아이콘, 레이블, 현재 상태 및 애플리케이션 정의 값이 있습니다. 목록 보기 메시지를 사용하여 항목을 추가, 수정 및 삭제하고 항목에 대한 정보를 검색할 수 있습니다.
각 항목에는 하나 이상의 하위 항목이수 있습니다. 하위 항목은 보고서 보기에서 항목의 아이콘 및 레이블과는 별도로 열에 표시되는 문자열입니다. 하위 항목의 텍스트를 지정하려면 LVM_SETITEMTEXT 또는 LVM_SETITEM 메시지를 사용합니다. 목록 보기 컨트롤의 모든 항목에는 동일한 수의 하위 항목이 있습니다. 하위 항목의 수는 목록 보기 컨트롤의 열 수에 따라 결정됩니다. 목록 보기 컨트롤에 열을 추가하면 연결된 하위 항목 인덱스가 지정됩니다.
LVITEM 구조체는 목록 보기 항목 또는 하위 항목을 정의합니다. iItem 멤버는 항목의 인덱스(0부터 시작하는 인덱스)입니다. iSubItem 멤버는 하위 항목의 1부터 시작하는 인덱스이거나 구조에 항목에 대한 정보가 포함된 경우 0입니다. 추가 멤버는 항목의 텍스트, 아이콘, 상태 및 항목 데이터를 지정합니다. 항목 데이터 목록 보기 항목과 연결된 애플리케이션 정의 값입니다.
목록 보기 컨트롤에 항목을 추가하려면 LVM_INSERTITEM 메시지를 사용하여 LVITEM 구조체의 주소를 지정합니다. 여러 항목을 추가하기 전에 컨트롤에 LVM_SETITEMCOUNT 메시지를 보내 컨트롤에 궁극적으로 포함할 항목 수를 지정할 수 있습니다. 이 메시지를 사용하면 목록 보기 컨트롤이 항목을 추가할 때마다가 아니라 내부 데이터 구조를 한 번만 다시 할당할 수 있습니다. LVM_GETITEMCOUNT 메시지를 사용하여 목록 보기 컨트롤의 항목 수를 확인할 수 있습니다. 목록 보기 컨트롤에 많은 수의 항목을 추가하는 경우 항목을 추가하기 전에 다시 그리기를 사용하지 않도록 설정하여 프로세스를 가속화한 다음, 항목을 추가한 후 다시 그리기를 사용하도록 설정할 수 있습니다. WM_SETREDRAW 메시지를 사용하여 다시 그리기를 사용하거나 사용하지 않도록 설정합니다.
목록 보기 항목의 특성을 변경하려면 LVM_SETITEM 메시지를 사용하여 LVITEM 구조체의 주소를 지정합니다. 이 구조체의 마스크 멤버는 변경할 항목 특성을 지정합니다. 예를 들어 항목 또는 하위 항목의 텍스트만 변경하려면 LVM_SETITEMTEXT 메시지를 사용합니다.
목록 보기 항목에 대한 정보를 검색하려면 LVM_GETITEM 메시지를 사용하여 채울 LVITEM 구조체의 주소를 지정합니다. 이 구조체의 마스크 멤버는 검색할 항목 특성을 지정합니다. 항목 또는 하위 항목의 텍스트만 검색하려면 LVM_GETITEMTEXT 메시지를 사용합니다.
목록 보기 항목을 삭제하려면 LVM_DELETEITEM 메시지를 사용합니다. LVM_DELETEALLITEMS 메시지를 사용하여 목록 보기 컨트롤의 모든 항목을 삭제할 수 있습니다.
List-View 항목 상태
항목의 상태는 항목의 가용성을 지정하거나, 사용자 작업을 나타내거나, 그렇지 않으면 항목의 상태를 반영하는 값입니다. 목록 보기 컨트롤은 사용자가 항목을 선택하는 경우와 같은 일부 상태 비트를 변경합니다. 애플리케이션은 항목을 사용하지 않도록 설정하거나 숨기거나 오버레이 이미지 또는 상태 이미지를 지정하기 위해 다른 상태 비트를 변경할 수 있습니다. 오버레이 이미지 및 상태 이미지에 대한 자세한 내용은 List-View 이미지 목록참조하세요.
항목의 상태는 LVITEM 구조체의 상태 멤버에 의해 지정됩니다. 항목의 상태를 지정하거나 변경할 때 stateMask 멤버는 변경해야 하는 상태 비트를 지정합니다. LVM_SETITEMSTATE 메시지를 사용하여 항목의 상태를 변경할 수 있습니다. 항목을 만들 때 또는 LVM_SETITEM 메시지를 사용하여 특성을 변경할 때 항목의 상태를 지정할 수 있습니다. 항목의 현재 상태를 확인하려면 LVM_GETITEMSTATE 또는 LVM_GETITEM 메시지를 사용합니다.
항목의 오버레이 이미지를 설정하려면 LVITEM 구조체의 stateMask 멤버에 LVIS_OVERLAYMASK 값이 포함되어야 하며, 상태 멤버는 INDEXTOOVERLAYMASK 매크로를 사용하여 왼쪽 8비트 이동된 오버레이 이미지의 1부터 시작하는 인덱스를 포함해야 합니다. 인덱스가 0이면 오버레이 이미지를 지정하지 않습니다.
항목의 상태 이미지를 설정하려면 LVITEM 구조의 stateMask 멤버에 LVIS_STATEIMAGEMASK 값이 포함되어야 하며, 상태 멤버는 INDEXTOSTATEIMAGEMASK 매크로를 사용하여 왼쪽 12비트 왼쪽으로 이동한 상태 이미지의 1부터 시작하는 인덱스를 포함해야 합니다. 상태 이미지를 지정하지 않는 인덱스가 0일 수 있습니다.
콜백 항목 및 콜백 마스크
각 항목에 대해 목록 보기 컨트롤은 일반적으로 레이블 텍스트, 항목 아이콘의 이미지 목록 인덱스 및 항목 상태에 대한 비트 플래그 집합을 저장합니다. 콜백 항목을 정의하거나 컨트롤의 콜백 마스크를 변경하여 컨트롤이 아닌 애플리케이션이 이 정보의 일부 또는 전부를 저장함을 나타낼 수 있습니다. 애플리케이션에서 이 정보 중 일부를 저장하는 경우 콜백을 사용할 수 있습니다.
목록 보기 컨트롤에서 콜백 항목은 애플리케이션이 텍스트 또는 아이콘 인덱스 또는 둘 다를 저장하는 항목입니다. LVM_INSERTITEM 메시지를 보내 목록 보기 컨트롤에 항목을 추가할 때 콜백 항목을 정의할 수 있습니다. 애플리케이션에서 항목 또는 하위 항목에 대한 텍스트를 저장하는 경우 항목의 LVITEM 구조체의 pszText 멤버를 LPSTR_TEXTCALLBACK설정합니다. 애플리케이션에서 항목의 아이콘 인덱스를 저장할 경우, 항목의 LVITEM 구조체의 iImage 멤버를 I_IMAGECALLBACK로 설정합니다.
목록 보기 컨트롤의 콜백 마스크는 컨트롤이 아닌 애플리케이션이 현재 데이터를 저장하는 항목 상태를 지정하는 비트 플래그 집합입니다. 콜백 마스크는 특정 항목에 적용되는 콜백 항목 지정과 달리 컨트롤의 모든 항목에 적용됩니다. 콜백 마스크는 기본적으로 0입니다. 즉, 목록 보기 컨트롤은 모든 항목 상태 정보를 저장합니다. 목록 보기 컨트롤을 만들고 해당 항목을 초기화한 후 LVM_SETCALLBACKMASK 메시지를 보내 콜백 마스크를 변경할 수 있습니다. 현재 콜백 마스크를 검색하려면 LVM_GETCALLBACKMASK 메시지를 보냅니다.
목록 보기 컨트롤이 애플리케이션에서 콜백 정보를 저장하는 목록 보기 항목을 표시하거나 정렬해야 하는 경우 컨트롤은 LVN_GETDISPINFO 알림 코드를 컨트롤의 부모 창으로 보냅니다. 이 메시지는 필요한 정보의 형식을 포함하고 검색할 항목 또는 하위 항목을 식별하는 NMLVDISPINFO 구조를 지정합니다. 부모 창은 요청된 데이터를 제공하기 위해 LVN_GETDISPINFO 처리해야 합니다.
목록 보기 컨트롤이 텍스트, 아이콘 또는 상태 정보의 변경과 같은 항목의 콜백 정보의 변경 내용을 감지하는 경우 컨트롤은 변경 내용을 알리는 LVN_SETDISPINFO 알림 코드를 보냅니다.
콜백 항목의 특성 또는 상태 비트를 변경하는 경우 LVM_UPDATE 메시지를 사용하여 컨트롤이 항목을 다시 그리도록 합니다. 또한 이 메시지는 컨트롤에 LVS_AUTOARRANGE 스타일이 있는 경우 해당 항목을 정렬하도록 합니다. LVM_REDRAWITEMS 메시지를 사용하여 목록 보기 컨트롤의 클라이언트 영역의 해당 부분을 무효화하여 항목 범위를 다시 그릴 수 있습니다.
콜백 항목과 콜백 마스크를 효과적으로 사용하면 각 항목 특성이 한 곳에서만 유지되도록 할 수 있습니다. 이렇게 하면 애플리케이션이 간소화될 수 있지만 저장되는 유일한 공간은 항목 레이블 및 하위 항목 텍스트를 저장하는 데 필요한 메모리뿐입니다.
List-View 항목 위치
모든 목록 보기 항목에는 메시지를 사용하여 검색하고 설정할 수 있는 위치와 크기가 있습니다. 지정된 위치에 있는 항목(있는 경우)을 확인할 수도 있습니다. 보기 좌표 은/는 스크롤 위치에 의해 오프셋된 클라이언트 좌표로, 목록 보기 항목의 위치가으로 지정됩니다.
항목의 위치를 검색하고 설정하려면 LVM_GETITEMPOSITION 메시지를 사용하고, LVM_SETITEMPOSITION 메시지를 사용하세요. LVM_GETITEMPOSITION 모든 보기에서 작동하지만 LVM_SETITEMPOSITION 아이콘 및 작은 아이콘 보기에서만 작동합니다.
LVM_HITTEST 메시지를 사용하여 특정 위치에 있는 항목(있는 경우)을 확인할 수 있습니다.
목록 항목 또는 해당 아이콘 또는 레이블에 대해서만 경계 사각형을 검색하려면 LVM_GETITEMRECT 메시지를 사용합니다.
배열, 정렬 및 항목 찾기
목록 보기 메시지를 사용하여 항목을 정렬 및 정렬하고 특성 또는 위치에 따라 항목을 찾을 수 있습니다. 항목을 눈금에 맞춰 재배치하여 정렬하지만, 항목의 인덱스는 변경되지 않습니다. 정렬하면 항목의 시퀀스(및 해당 인덱스)가 변경된 다음 그에 따라 위치가 변경됩니다. 아이콘 및 작은 아이콘 보기에서만 항목을 정렬할 수 있지만 모든 보기에서 항목을 정렬할 수 있습니다. 항목을 찾으려면 항목 위치 또는 속성을 지정하는 목록 보기 메시지를 보냅니다.
항목을 정렬하려면 LVM_ARRANGE 메시지를 사용합니다. LVS_AUTOARRANGE 창 스타일을 지정하여 항목이 항상 정렬되도록 할 수 있습니다.
항목을 정렬하려면 LVM_SORTITEMS 메시지를 사용합니다. 이 메시지를 사용하여 정렬할 때 목록 보기 컨트롤이 호출하는 애플리케이션 정의 콜백 함수를 지정하여 두 항목의 상대 순서를 비교합니다. 컨트롤은 두 항목 각각과 연결된 항목 데이터를 비교 함수에 전달합니다. 항목 데이터는 목록에 삽입될 때 항목의 LVITEM 구조체의 lParam 멤버에 지정된 값입니다. 적절한 항목 데이터를 지정하고 적절한 비교 함수를 제공하면 해당 레이블, 하위 항목 또는 다른 속성별로 항목을 정렬할 수 있습니다. 정렬 항목은 해당 하위 항목의 순서를 다시 지정하지 않습니다. 항목의 순서를 다시 지정하면 해당 하위 항목이 해당 항목과 함께 전달됩니다. 즉, 전체 행이 함께 유지됩니다. 열을 서로 별도로 정렬하고 항목에서 하위 항목을 분리하려면 LVM_SETITEM사용하여 정렬한 후 열을 다시 생성해야 합니다.
LVS_SORTASCENDING 또는 LVS_SORTDESCENDING 창 스타일을 지정하여 목록 보기 컨트롤이 항상 정렬되도록 할 수 있습니다. 이러한 스타일을 사용하는 컨트롤은 항목의 레이블 텍스트를 사용하여 오름차순 또는 내림차순으로 정렬합니다. 이러한 창 스타일을 사용하는 경우 비교 함수를 제공할 수 없습니다. 목록 보기 컨트롤에 이러한 스타일 중 하나가 있는 경우 LVITEM 구조체의 pszText 멤버로 LPSTR_TEXTCALLBACK 있는 항목을 삽입하려고 하면 LVM_INSERTITEM 메시지가 실패합니다.
LVM_FINDITEM 메시지를 사용하여 특정 속성이 있는 목록 보기 항목을 찾을 수 있습니다. LVM_GETNEXTITEM 메시지를 사용하여 지정된 상태이고 지정된 항목과 지정된 관계가 있는 목록 보기 항목을 찾을 수 있습니다. 예를 들어 선택한 다음 항목을 지정된 항목의 오른쪽에 검색할 수 있습니다.
List-View 열
열은 항목과 해당 하위 항목이 보고서 보기에 표시되는 방식을 결정합니다. 각 열에는 제목과 너비가 있으며 특정 하위 항목과 연결됩니다. 하위 항목 0은 항목의 아이콘 및 레이블입니다. 열의 특성은 LVCOLUMN 구조체에 의해 정의됩니다.
목록 보기 컨트롤에 열을 추가하려면 LVM_INSERTCOLUMN 메시지를 사용합니다. 열을 삭제하려면 LVM_DELETECOLUMN 메시지를 사용합니다.
메모
목록 보기 컨트롤의 열 0 삭제는 ComCtl32.dll 버전 6 이상에서만 지원됩니다. 버전 5에서는 열 0 삭제도 지원하지만 CCM_SETVERSION 사용하여 버전을 5 이상으로 설정한 후에만 가능합니다. 버전 5 이전 버전에서는 열 0 삭제를 지원하지 않습니다.
LVM_GETCOLUMN 및 LVM_SETCOLUMN 메시지를 사용하여 기존 열의 속성을 검색하고 변경할 수 있습니다. 열의 너비를 검색하거나 변경하려면 메시지 LVM_GETCOLUMNWIDTH 및 LVM_SETCOLUMNWIDTH을 사용하십시오.
LVS_NOCOLUMNHEADER 창 스타일을 지정하지 않으면 열 머리글이 보고서 보기에 표시됩니다. 사용자가 열 머리글을 클릭하면 LVN_COLUMNCLICK 알림 코드가 부모 창으로 전송됩니다. 일반적으로 부모 창은 이 클릭이 발생할 때 지정된 열을 기준으로 목록 보기 컨트롤을 정렬합니다. 또한 사용자는 머리글 간에 열 안내선을 끌어 열 크기를 지정할 수도 있습니다.
목록 보기 컨트롤은 열 제목 옆에 이미지를 표시할 수 있습니다. 이 기능을 구현하려면 LVCF_IMAGE 값을 지정하고 LVCOLUMN 구조의 iImage 멤버에 이미지의 인덱스 할당합니다.
목록 보기 컨트롤은 열이 표시되는 순서를 설정할 수 있습니다. 이 기능을 구현하려면 LVCF_ORDER 값을 지정하고 LVCOLUMN 구조의 iOrder 멤버에 열 순서를 할당합니다. 열 순서는 0부터 시작하고 왼쪽에서 오른쪽 순서입니다. 예를 들어 0은 맨 왼쪽 열을 나타냅니다.
List-View 스크롤 위치
LVS_NOSCROLL 창 스타일을 지정하지 않으면 목록 보기 컨트롤을 스크롤하여 컨트롤의 클라이언트 영역에 들어갈 수 있는 것보다 많은 항목을 표시할 수 있습니다. 목록 보기 컨트롤의 스크롤 위치 및 관련 정보를 검색하거나, 목록 보기 컨트롤을 지정된 양만큼 스크롤하거나, 목록 보기 컨트롤을 스크롤하여 지정된 목록 항목이 표시되도록 할 수 있습니다.
아이콘 보기 또는 작은 아이콘 보기에서 현재 스크롤 위치는 뷰 원본의해 정의됩니다. 뷰 원점은 뷰 좌표(0, 0)에 해당하는 목록 보기 컨트롤의 표시 영역을 기준으로 하는 좌표 집합입니다. 현재 뷰 원본을 검색하려면 LVM_GETORIGIN 메시지를 사용합니다. 이 메시지는 아이콘 또는 작은 아이콘 보기에서만 사용해야 합니다. 목록 또는 보고서 보기에서 오류를 반환합니다.
목록 또는 보고서 보기에서 현재 스크롤 위치는 최상위 인덱스의해 정의됩니다. 위쪽 인덱스는 목록 보기 컨트롤에 표시되는 첫 번째 항목의 인덱스입니다. 현재 상위 인덱스 검색하려면 LVM_GETTOPINDEX 메시지를 사용합니다. 이 메시지는 목록 또는 보고서 보기에서만 유효한 결과를 반환합니다. 아이콘 또는 작은 아이콘 보기에서 0을 반환합니다.
LVM_GETVIEWRECT 메시지를 사용하여 컨트롤의 표시 영역을 기준으로 목록 보기 컨트롤에 있는 모든 항목의 경계 사각형을 검색할 수 있습니다.
LVM_GETCOUNTPERPAGE 메시지는 목록 보기 컨트롤의 한 페이지에 맞는 항목 수를 반환합니다. 이 메시지는 목록 및 보고서 뷰에서만 유효한 결과를 반환합니다. 아이콘 및 작은 아이콘 보기에서 총 항목 수를 반환합니다.
목록 보기 컨트롤을 특정 크기만큼 스크롤하려면 LVM_SCROLL 메시지를 사용합니다. LVM_ENSUREVISIBLE 메시지를 사용하여 필요한 경우 목록 보기 컨트롤을 스크롤하여 지정된 항목이 표시되는지 확인할 수 있습니다.
List-View 레이블 편집
LVS_EDITLABELS 창 스타일이 있는 목록 보기 컨트롤을 사용하면 사용자가 항목 레이블을 제자리에서 편집할 수 있습니다. 사용자가 포커스가 있는 항목의 레이블을 클릭하여 편집을 시작합니다. 또는 애플리케이션이 LVM_EDITLABEL 메시지를 사용하여 자동으로 편집을 시작할 수 있습니다. 목록 보기 컨트롤은 편집이 시작되고 취소되거나 완료될 때 부모 창에 알립니다. 편집이 완료되면 부모 창은 적절한 경우 항목의 레이블을 업데이트합니다.
레이블 편집이 시작되면 편집 컨트롤 생성, 배치 및 초기화됩니다. 표시되기 전에 목록 보기 컨트롤은 부모 창에 LVN_BEGINLABELEDIT 알림 코드를 보냅니다. 레이블 편집 프로세스를 수정해야 하는 경우 이 알림에 대한 처리기를 구현할 수 있습니다.
LVN_BEGINLABELEDIT 알림 처리기에 대한 한 가지 사용은 사용자가 편집할 수 있는 레이블을 제어하는 것입니다. 레이블 편집을 방지하려면 0이 아닌 값을 반환합니다. 레이블 편집을 사용자 지정하려면 알림 처리기가 목록 보기 컨트롤에 LVM_GETEDITCONTROL 메시지를 전송하여 편집 컨트롤에 대한 핸들을 검색하도록 합니다. 해당 핸들이 있으면 일반적인 EM_XXX 메시지를 전송하여 편집 컨트롤을 사용자 지정할 수 있습니다. 예를 들어 사용자가 입력할 수 있는 텍스트의 양을 제한하려면 편집 컨트롤에 EM_LIMITTEXT 메시지를 보냅니다. SetWindowText편집 컨트롤의 기본 텍스트를 변경할 수 있습니다. 편집 컨트롤을 서브클래스하여 잘못된 문자를 가로채고 삭제할 수도 있습니다.
레이블 편집이 취소되거나 완료되면 목록 보기 컨트롤이 부모 창에 LVN_ENDLABELEDIT 알림 코드를 보냅니다. lParam 매개 변수는 NMLVDISPINFO 구조체의 주소입니다. 이 구조체에서 항목 구성원은 LVITEM 구조체로, 여기서 iItem 멤버가 항목을 식별합니다. 편집이 취소되면 pszText 멤버는 LVITEM 구조체에서 NULL입니다; 그렇지 않으면 pszText는 편집된 텍스트의 주소입니다. 부모 창은 새 레이블을 유지하려는 경우 항목의 레이블을 업데이트해야 합니다.
List-View 색상 컬렉션
애플리케이션은 목록 보기 컨트롤에 대해 세 가지 색을 검색하고 설정할 수 있습니다.
색 | 색을 검색하고 설정하는 데 사용되는 메시지 |
---|---|
텍스트 색 | LVM_GETTEXTCOLOR, LVM_SETTEXTCOLOR |
텍스트 배경색 | LVM_GETTEXTBKCOLOR, LVM_SETTEXTBKCOLOR |
창 배경색 | LVM_GETBKCOLOR, LVM_SETBKCOLOR |
목록 보기 컨트롤의 모양을 더 크게 사용자 지정하려면 NM_CUSTOMDRAW(목록 보기)을 사용하거나, 비주얼 스타일을 적용하십시오(자세한 내용은 비주얼 스타일 및 비주얼 스타일 활성화참조).
그룹별 목록 항목 정렬
목록 보기 컨트롤의 그룹화 기능을 사용하면 논리적으로 관련된 항목 집합을 시각적으로 그룹화할 수 있습니다. 항목 속성, 특성 또는 기타 특성에 따라 그룹을 만들 수 있습니다. 이러한 그룹은 일반적으로 화면에서 그룹 이름을 포함하는 가로 머리글로 구분됩니다. 다음 스크린샷은 그룹화된 항목을 보여줍니다.
스크린샷
LVGROUP 구조를 사용하여 머리글 및 바닥글 텍스트, 그룹의 현재 상태 등과 같은 그룹에 대한 정보를 저장합니다. 그룹화 API에는 그룹에 항목을 추가하고, 보기에 그룹을 추가하고, 그룹 항목을 정렬하고, 항목 크기 및 기타 정보에 대한 그룹을 쿼리하여 그룹 및 그룹 요소를 관리할 수 있는 메시지가 포함되어 있습니다. 예를 들어 ListView_SetGroupMetrics 및 ListView_GetGroupMetrics 매크로를 사용하여 각 그룹에 대한 표시 매개 변수를 설정하고 검색할 수 있습니다.
그룹화는 목록 보기를 제외한 모든 보기에서 사용할 수 있습니다. LVS_OWNERDATA 스타일이 있는 컨트롤에서는 사용할 수 없습니다.
자세한 내용은 List-View 컨트롤 사용참조하세요.
삽입 표시
삽입 표시는 끌어온 항목이 배치되는 위치를 사용자에게 표시합니다. 삽입 표시는 현재 사용자가 항목을 시작 메뉴 또는 빠른 실행 표시줄로 끌 때 표시됩니다. 삽입 표시는 자동 정렬로 설정된 목록에 대해서도 작동합니다. 사용자가 항목을 다른 두 항목 사이의 지점으로 끌면 삽입 표시에 항목의 예상 새 위치가 표시됩니다. 다음 스크린샷은 삽입 표시를 보여줍니다.
삽입 표시 API 요소를 사용하면 적중 검색을 수행하는 메시지와 플래그를 제공하고, 항목별로 삽입 표시의 위치와 모양을 지정하고, 삽입 표시의 현재 크기와 모양에 대한 정보를 쿼리하여 삽입 표시를 배치할 수 있습니다.