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


Элементы управления виртуальными списками

Замечание

Библиотека классов Microsoft Foundation (MFC) продолжает поддерживаться. Однако мы больше не добавляем функции или обновляем документацию.

Элемент управления виртуальным списком — это элемент управления представлением списка с LVS_OWNERDATA стилем. Этот стиль позволяет контролу поддерживать количество элементов до DWORD (в то время как количество элементов по умолчанию ограничивается int). Однако самым большим преимуществом, предоставляемым этим стилем, является возможность иметь только подмножество элементов данных в памяти в любое время. Это позволяет элементу управления представлением виртуального списка использовать большие базы данных информации, где уже существуют определенные методы доступа к данным.

Замечание

Помимо предоставления функций виртуального списка в CListCtrlMFC, также предоставляет те же функции в классе CListView .

При разработке элементов управления виртуальными списками следует учитывать некоторые проблемы совместимости. Дополнительные сведения см. в разделе "Проблемы совместимости" раздела "Элементы управления List-View" в пакете SDK для Windows.

Обработка уведомления LVN_GETDISPINFO

Элементы управления виртуальными списками поддерживают очень мало сведений о элементах. За исключением сведений о выборе и фокусе элемента, все сведения об элементах управляются владельцем элемента управления. Сведения запрашиваются платформой с помощью уведомления LVN_GETDISPINFO. Чтобы предоставить запрошенные сведения, владелец элемента управления виртуальным списком (или сам элемент управления) должен обработать это уведомление. Это можно легко сделать с помощью мастера классов (см. статью "Сопоставление сообщений с функциями"). Результирующий код должен выглядеть примерно так, как в следующем примере (где CMyDialog принадлежит объект управления виртуальным списком и диалоговое окно обрабатывает уведомление):

ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST3, &CMyDialog::OnLvnGetdispinfoList3)

В обработчике сообщения уведомления LVN_GETDISPINFO необходимо проверить, какой тип информации запрашивается. Возможные значения:

  • LVIF_TEXT Элемент pszText должен быть заполнен.

  • LVIF_IMAGE Элемент iImage должен быть заполнен.

  • LVIF_INDENT Элемент iIndent должен быть заполнен.

  • LVIF_PARAM Элемент lParam должен быть заполнен. (Не присутствует для вложенных элементов.)

  • LVIF_STATE Поле состояния должно быть заполнено.

Затем необходимо указать любые сведения, запрашиваемые обратно в платформу.

В следующем примере (взятом из текста обработчика уведомлений для объекта элемента управления списком) демонстрируется один из возможных методов, предоставляя сведения для текстовых буферов и изображения элемента:

NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO *>(pNMHDR);
LVITEM *pItem = &(pDispInfo)->item;

int iItem = pItem->iItem;

if (pItem->mask & LVIF_TEXT) //valid text buffer?
{
   switch (pItem->iSubItem)
   {
   case 0: //fill in main text
      _tcscpy_s(pItem->pszText, pItem->cchTextMax,
                m_Items[iItem].m_strItemText);
      break;
   case 1: //fill in sub item 1 text
      _tcscpy_s(pItem->pszText, pItem->cchTextMax,
                m_Items[iItem].m_strSubItem1Text);
      break;
   case 2: //fill in sub item 2 text
      _tcscpy_s(pItem->pszText, pItem->cchTextMax,
                m_Items[iItem].m_strSubItem2Text);
      break;
   }
}

if (pItem->mask & LVIF_IMAGE) //valid image?
{
   pItem->iImage = m_Items[iItem].m_iImage;
}

Кэширование и элементы управления виртуальным списком

Так как этот тип элемента управления списка предназначен для больших наборов данных, рекомендуется кэшировать запрошенные данные элементов для повышения производительности извлечения. Платформа предоставляет механизм подсказки для кэша, чтобы помочь в оптимизации кэша, отправляя уведомление-сообщение LVN_ODCACHEHINT.

В следующем примере кэш обновляется на основе диапазона, переданного в функцию обработчика.

void CMyDialog::OnLvnOdcachehintList3(NMHDR* pNMHDR, LRESULT* pResult)
{
   LPNMLVCACHEHINT pCacheHint = reinterpret_cast<LPNMLVCACHEHINT>(pNMHDR);

   // Update the cache with the recommended range.
   for (int i = pCacheHint->iFrom; i <= pCacheHint->iTo; i++)
   {
      m_Items[i].m_iImage = i % 2;
      m_Items[i].m_strItemText.Format(_T("Item %d"), i);
      m_Items[i].m_strSubItem1Text = _T("Sub 1");
      m_Items[i].m_strSubItem2Text = _T("Sub 2");
   }

   *pResult = 0;
}

Дополнительные сведения о подготовке и обслуживании кэша см. в разделе "Управление кэшем" раздела "Элементы управления List-View" в пакете SDK для Windows.

Поиск определенных элементов

Сообщение уведомления LVN_ODFINDITEM отправляется виртуальным элементом управления списком, когда нужно найти определенный элемент списка. Уведомление отправляется, когда элемент управления представлением списка получает быстрый доступ к ключу или при получении сообщения LVM_FINDITEM. Данные поиска отправляются в виде структуры LVFINDINFO , которая является членом структуры NMLVFINDITEM . Обработайте сообщение, переопределив функцию OnChildNotify вашего объекта управления списком, и в теле обработчика проверьте наличие сообщения LVN_ODFINDITEM. При обнаружении выполните соответствующее действие.

Необходимо подготовиться к поиску элемента, соответствующего сведениям, заданным элементом управления представлением списка. При успешном выполнении следует вернуть индекс элемента или -1, если соответствующий элемент не найден.

См. также

Использование CListCtrl
Элементы управления