List-View 작업 영역을 사용하는 방법
이 항목에서는 목록 보기 작업 영역을 사용하는 방법을 보여 줍니다. 작업 영역은 목록 보기 컨트롤에서 항목을 정렬하는 데 사용할 수 있는 사각형 가상 영역입니다. 작업 영역은 창이 아니고 표시되는 테두리를 가질 수 없습니다. 기본적으로 목록 보기 컨트롤에는 작업 영역이 없습니다. 작업 영역을 만들면 항목의 왼쪽, 위쪽 또는 오른쪽에 빈 테두리를 만들거나 일반적으로 테두리가 없을 때 가로 스크롤 막대가 표시되도록 할 수 있습니다.
알아야 할 사항
기술
필수 구성 요소
- C/C++
- Windows 사용자 인터페이스 프로그래밍
지시
작업 영역 만들기
다음 C++ 코드 예제에서는 위쪽, 왼쪽 및 오른쪽에 25픽셀 빈 테두리가 있는 작업 영역을 만드는 방법을 보여 줍니다.
void SetWorkAreas1(HWND hWndListView)
{
#define EMPTY_SPACE 25
RECT rcClient;
GetClientRect(hWndListView, &rcClient);
rcClient.left += EMPTY_SPACE;
rcClient.top += EMPTY_SPACE;
rcClient.right -= (EMPTY_SPACE * 2);
SendMessage(hWndListView, LVM_SETWORKAREAS, 1, (LPARAM)&rcClient);
return;
}
여러 작업 영역 만들기
다음 C++ 코드 예제에서는 컨트롤에서 두 개의 작업 영역을 만드는 방법을 보여 줍니다. 각 작업 영역은 클라이언트 영역의 약 절반을 사용하며 25픽셀의 빈 테두리로 둘러싸여 있습니다.
void SetWorkAreas2(HWND hWndListView)
{
#define EMPTY_SPACE 25
RECT rcClient;
RECT rcWork[2];
GetClientRect(hWndListView, &rcClient);
rcWork[0].left = rcClient.left + EMPTY_SPACE;
rcWork[0].top = rcClient.top + EMPTY_SPACE;
rcWork[0].right = (rcClient.right/2) - EMPTY_SPACE;
rcWork[0].bottom = rcClient.bottom;
rcWork[1].left = (rcClient.right/2) + EMPTY_SPACE;
rcWork[1].top = rcClient.top + EMPTY_SPACE;
rcWork[1].right = rcClient.right - EMPTY_SPACE;
rcWork[1].bottom = rcClient.bottom;
SendMessage(hWndListView, LVM_SETWORKAREAS, 2, (LPARAM)rcWork);
return;
}
항목이 속한 작업 영역 확인
항목이 속한 작업 영역을 확인하는 한 가지 방법은 다음을 수행하는 것입니다.
- 목록 보기 컨트롤에서 모든 작업 영역의 좌표 목록을 검색합니다.
- 항목의 좌표를 검색합니다.
- 항목 좌표가 작업 영역 중 하나의 좌표 내에 있는지 여부를 확인합니다.
다음 C++ 코드 예제의 애플리케이션 정의 함수는 항목이 속한 작업 영역의 인덱스를 반환합니다. 함수가 실패하면 -1을 반환합니다. 함수가 성공하지만 항목이 작업 영역 내에 없는 경우 작업 영역 내에 없는 모든 항목이 자동으로 작업 영역 0의 멤버가 되므로 함수는 0을 반환합니다.
int GetItemWorkingArea(HWND hWndListView, int iItem)
{
UINT uWorkAreas = 0;
int nReturn = -1;
LPRECT pRects;
POINT pt;
if(!ListView_GetItemPosition(hWndListView, iItem, &pt))
return nReturn;
ListView_GetNumberOfWorkAreas(hWndListView, &uWorkAreas);
if(uWorkAreas)
{
pRects = (LPRECT)GlobalAlloc(GPTR, sizeof(RECT) * uWorkAreas);
if(pRects)
{
UINT i;
nReturn = 0;
ListView_GetWorkAreas(hWndListView, uWorkAreas, pRects);
for(i = 0; i < uWorkAreas; i++)
{
if(PtInRect((pRects + i), pt))
{
nReturn = i;
break;
}
}
GlobalFree((HGLOBAL)pRects);
}
}
return nReturn;
}
관련 항목