Использование рабочих областей представления списка
В этом разделе показано, как работать с рабочими областями представления списка. Рабочие области — это прямоугольные виртуальные области, которые можно использовать для упорядочивания элементов в элементе управления представлением списка. Рабочая область не является окном и не может иметь видимую границу. По умолчанию элемент управления "Представление списка" не имеет рабочих областей. Создав рабочую область, можно создать пустую границу слева, сверху или справа от элементов или отобразить горизонтальную полосу прокрутки, если обычно не будет.
Это важно знать
Технологии
Необходимые компоненты
- C/C++
- Программирование пользовательского интерфейса Windows
Instructions
Создание рабочей области
В следующем примере кода 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, так как все элементы, не находящиеся внутри рабочей области, автоматически становятся членом рабочей области ноль.
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;
}
См. также