Содержание элементов
Содержание элементов
Итак, виртуальный список хранит очень мало информации. За заполнение элементов перед отрисовкой отвечает приложение. Для этого список посылает уведомление LVN_GETDISPINFO. Обработчик несложно добавить, воспользовавшись ClassWizzard.
В обработчике уведомления LVN_GETDISPINFO необходимо проверить, какая информация требуется, и заполнить соответствующие поля.
В следующем примере показан один из способов реализации.
void CMyListView::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult) {
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM* pItem= &(pDispInfo)->item;
CMyDocument* pDoc = GetDocument();
int nIndex= pItem->iItem;
if (pItem->mask & LVIF_TEXT) //требуется текст?
strcpy(pItem->pszText, pDoc->GetItemText(pItem->iSubItem, nIndex));
if pItem->mask & LVIF_IMAGE) //требуется картинка
pItem->iImage= pDoc->GetItemImage(nIndex);
}
Здесь GetItemText и GetItemImage функции класса документа, возвращающие текст меток и номер изображения требуемого элемента соответственно.
По умолчанию виртуальный список не хранит информацию поля state, за исключением двух флагов LVIS_SELECTED и LVIS_FOCUSED. Это приводит к тому, что использование иконок состояния (state image) невозможно. Однако эту ситуацию легко исправить. Необходимо использовать сообщение LVM_SETCALLBACKMASK, позволяющее задать маску для хранимой списком информации об элементах.
// Разрешаем использовать иконки состояния
SendMessage(LVM_SETCALLBACKMASK, LVIS_STATEIMAGEMASK, 0);