Поделиться через


Как использовать рабочие области 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, так как все элементы, не находящиеся внутри рабочей области, автоматически становятся членом рабочей области ноль.

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;
}

Справочник по элементу управления List-View

О элементах управления List-View

"использование элементов управления «List-View» «»"