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


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

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

Примечание

Кроме того, что виртуальную функцию списка в CListCtrl, MFC также предоставляет те же функциональные возможности в классе CListView.

Некоторые проблемы совместимости следует иметь в виду развивая виртуальные элементы управления "Список". Дополнительные сведения см. в разделе проблем совместимости раздела список элементов управления в Windows SDK.

Обработка уведомления 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);
LV_ITEM* 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;
}

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

Найти определенные элементы

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

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

См. также

Ссылки

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

Основные понятия

Элементы управления (MFC)