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


Виртуальные элементы управления "Список"

Виртуальный элемент управления " Список " элементе управления списка, который имеет стиль 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_INDENTiIndent элемент должен заполнять.

  • 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)