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


Использование рабочих областей представления списка

В этом разделе показано, как работать с рабочими областями представления списка. Рабочие области — это прямоугольные виртуальные области, которые можно использовать для упорядочивания элементов в элементе управления представлением списка. Рабочая область не является окном и не может иметь видимую границу. По умолчанию элемент управления "Представление списка" не имеет рабочих областей. Создав рабочую область, можно создать пустую границу слева, сверху или справа от элементов или отобразить горизонтальную полосу прокрутки, если обычно не будет.

Это важно знать

Технологии

Необходимые компоненты

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

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

Сведения о элементах управления "Представление списка"

Использование элементов управления "Представление списка"