Тимофей Чадов - Использование ListView в режиме виртуального списка

Тут можно читать онлайн Тимофей Чадов - Использование ListView в режиме виртуального списка - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Использование ListView в режиме виртуального списка
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    3.56/5. Голосов: 91
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Тимофей Чадов - Использование ListView в режиме виртуального списка краткое содержание

Использование ListView в режиме виртуального списка - описание и краткое содержание, автор Тимофей Чадов, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Использование ListView в режиме виртуального списка - читать онлайн бесплатно полную версию (весь текст целиком)

Использование ListView в режиме виртуального списка - читать книгу онлайн бесплатно, автор Тимофей Чадов
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

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

Кажущиеся трудности

Итак, список создан и замечательно работает. Возможно, в некоторых случаях, Вам захочется реализовать и более сложные вещи.

Управление кешированием.

Если вы самостоятельно решили оперировать большими объемами информации – без кеширования не обойтись. Виртуальный список помогает оперировать процессом кеширования, посылая приложению уведомления LVN_ODCACHEHINT, в которых передает информацию о диапазоне элементов, которые необходимо отобразить на экране. Эту информацию можно использовать для динамического выделения памяти под требуемое число элементов и заполнения их корректными значениями.

void CMyListView::OnOdcachehint(NMHDR* pNMHDR, LRESULT* pResult) {

NMLVCACHEHINT* pCacheHint = (NMLVCACHEHINT*)pNMHDR;

// Подготовить кеш

PrepareCach(pCacheHint->iFrom, pCacheHint->iTo);

*pResult = 0;

}

Реализация функции, подобной PrepareCach, зависит от того, каким способом вы храните и обрабатываете данные, и может быть различной в зависимости от решаемой задачи. Данное уведомление всего лишь своевременная подсказка.

Нахождение специфических элементов

Когда списку необходимо найти специфический элемент, он посылает уведомление LVN_ODFINDITEM. Это может случиться, если требуется реализовать нажатие быстрой клавиши (поиск по имени), или элемент получил сообщение LVM_FINDITEM. Информация для поиска передается в двух структурах NMLVFINDITEMи LVFINDINFO. В них содержится: номер элемента, с которого следует начать поиск; элемент искомой строки; направление поиска и т.п.

void CMyListView::OnOdfinditem(NMHDR* pNMHDR, LRESULT* pResult) {

NMLVFINDITEM* pFindInfo = (NMLVFINDITEM*)pNMHDR;

LVFINDINFO FindItem = pFindInfo->lvfi;

if (FindItem.flags & LVFI_STRING) {

//ишем FindItem.psz начиная pFindInfo->iStart

*pResult = GetDocument()->FindItem(FindItem.psz, pFindInfo->iStart);

return;

}

*pResult = –1;

}

Обработчик уведомления должен вернуть номер искомого элемента или –1 в случае неудачи.

Сортировка

Трудности? Это еще что такое? Однако бесплатный сыр сами знаете где. Дело в том, что, так как сами элементы в списке не хранятся, придется самим заботится о сортировке. Не удастся воспользоваться функцией CListCtrl::SortItems, бесполезно писать CompareItems и т.п. Все, что у вас есть – это порядковый номер элемента.

Но, нет худа без добра. Действительно, обладая дополнительной информацией об используемых данных, можно выбрать более подходящую функцию сортировки, а значит – повысить производительность. Кроме того, в ряде случаев, даже такая проблема не стоит. Если информация берется из базы данных, нет необходимости самостоятельно сортировать элементы, достаточно учесть это при составлении запроса. При использовании в качестве хранилища элементов контейнеров из STL, можно использовать возможности этой библиотеки. В большинстве практических случаев этого бывает достаточно.

Альтернатива в заключение

Виртуальный режим не единственный способ заставить список запрашивать информацию об элементах. Можно при добавлении элемента задать значение pszText структуры LVITEMравным LPSTR_TEXTCALLBACK. В этом случае, также будут приходить уведомления LVN_GETDISPINFO. Однако при этом, придется самостоятельно заботиться о добавлении|удалении элементов, вместо одного вызова SetItemCount для виртуального режима. Кроме того, не будет заметного выигрыша в экономии памяти и скорости. Более подробно данный способ описан в статье Chris Maunder. Using text callbacks in ListView Controls.

Напоследок, небольшое резюме. Как вы уже поняли, элемент управления ListView достаточно гибок в использовании, и для написания качественного кода, важно не ошибиться в выборе необходимого режима работы. У каждого, как всегда, свои плюсы и минусы. Выбор (и ответственность) за Вами. Я всего лишь хотел помочь разобраться с этим.

P.S. Специальное спасибо Willi за подсказку об иконках состояния.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Тимофей Чадов читать все книги автора по порядку

Тимофей Чадов - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Использование ListView в режиме виртуального списка отзывы


Отзывы читателей о книге Использование ListView в режиме виртуального списка, автор: Тимофей Чадов. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x