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


Реализация рабочих областей в элементах управления "Список"

По умолчанию элемент управления списком упорядочивает все элементы стандартной сетки. Однако другой метод поддерживается, рабочие области, которые упорядочивает элементы списка в прямоугольные группы. Изображение элемента управления списком, реализующего рабочие области, см. в разделе "Использование элементов управления представлением списка" в пакете SDK для Windows.

Примечание.

Рабочие области видны только в том случае, если элемент управления списком находится в режиме значка или небольшого значка. Однако любые текущие рабочие области сохраняются, если представление переключится в режим отчета или списка.

Рабочие области можно использовать для отображения пустой границы (слева, сверху и /или справа от элементов) или отображения горизонтальной полосы прокрутки, когда обычно не будет. Другое частое использование заключается в создании нескольких рабочих областей, в которые можно переместить или удалить элементы. С помощью этого метода можно создать области в одном представлении с различными значениями. Затем пользователь может классифицировать элементы, помещая их в другую область. Примером этого будет представление файловой системы с областью для чтения и записи файлов и другой областью для файлов, доступных только для чтения. Если элемент файла был перемещен в область только для чтения, он автоматически станет доступным только для чтения. Перемещение файла из области только для чтения в область чтения и записи сделает файл чтением и записью.

CListCtrl предоставляет несколько функций-членов для создания рабочих областей в элементе управления списками и управления ими. GetWorkAreas и SetWorkAreas извлекают и задают массив CRect объектов (или RECT структур), которые хранят в настоящее время реализованные рабочие области для элемента управления списком. Кроме того, GetNumberOfWorkAreas извлекает текущее количество рабочих областей для элемента управления списком (по умолчанию — ноль).

Элементы и рабочие области

При создании рабочей области элементы, лежащие в рабочей области, становятся членами этой области. Аналогичным образом, если элемент перемещается в рабочую область, он становится членом рабочей области, в которую она была перемещена. Если элемент не лежит в рабочей области, он автоматически становится членом первой рабочей области (индекс 0). Если вы хотите создать элемент и поместить его в определенную рабочую область, необходимо создать элемент, а затем переместить его в нужную рабочую область с вызовом SetItemPosition. Второй пример ниже демонстрирует этот метод.

В следующем примере реализованы четыре рабочие области (rcWorkAreas), равные размеру с 10-пиксельной границой вокруг каждой рабочей области в элементе управления списком (m_WorkAreaListCtrl).

CSize size;
size = m_WorkAreaListCtrl.ApproximateViewRect();
size.cx += 100;
size.cy += 100;

CRect rcWorkAreas[4];
rcWorkAreas[0].SetRect(0, 0, (size.cx / 2) - 5, (size.cy / 2) - 5);
rcWorkAreas[1].SetRect((size.cx / 2) + 5, 0, size.cx, (size.cy / 2) - 5);
rcWorkAreas[2].SetRect(0, (size.cy / 2) + 5, (size.cx / 2) - 5, size.cy);
rcWorkAreas[3].SetRect((size.cx / 2) + 5, (size.cy / 2) + 5, size.cx, size.cy);

//set work areas
m_WorkAreaListCtrl.SetWorkAreas(4, rcWorkAreas);

Для получения оценки общей области, необходимой для отображения всех элементов в одном регионе, был выполнен вызов ApproximateViewRect . Эта оценка затем делится на четыре региона и заполняется 5-пиксельной границой.

Следующий пример назначает существующие элементы списка каждой группе (rcWorkAreas) и обновляет представление элемента управления (m_WorkAreaListCtrl) для завершения эффекта.

// set insertion points for each work area
CPoint rgptWork[4];
for (int i = 0; i < 4; i++)
{
   rgptWork[i].x = rcWorkAreas[i].left + 10;
   rgptWork[i].y = rcWorkAreas[i].top + 10;
}
// now move all the items to the different quadrants
for (int i = 0; i < 20; i++)
{
   m_WorkAreaListCtrl.SetItemPosition(i, rgptWork[i % 4]);
}

// force the control to rearrange the shuffled items
m_WorkAreaListCtrl.Arrange(LVA_DEFAULT);

См. также

Использование CListCtrl
Controls