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