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

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

Примечание.

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

При разработке элементов управления виртуальными списками следует учитывать некоторые проблемы совместимости. Дополнительные сведения см. в разделе "Проблемы совместимости" раздела "Элементы управления представлением списка" в пакете 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;
}

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

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

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

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

См. также

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