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