Вход/Регистрация
Программирование на Visual C++. Архив рассылки
вернуться

Jenter Алекс

Шрифт:

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 за подсказку об иконках состояния.

ЭКЗАМЕН

В этой новой рубрике будут публиковаться вопросы из самых различных экзаменов и тестов по Visual C++, WinAPI, MFC и др., а также конечно ответы на них ;-). Надеюсь вы найдете эту рубрику полезной. 

What synchronization object can only be used to synchronize threads for a single process? 

1. CriticalSection

2. Semaphore

3. Mutex

4. Timer

5. Event 

Верный ответ – 1. Critical Section. Критические секции не могут быть использованы для синхронизации потоков, принадлежащих разным процессам.

Это все на сегодня. До встречи!

Алекс Jenter jenter@rsdn.ru Duisburg, 2001. Рассылка является частью проекта RSDN. 

Программирование на Visual C++

Выпуск №52 от 28 октября 2001 г.

Здравствуйте, уважаемые подписчики!

Как вы заметили, внешний вид выпусков немного изменился – чтобы отметить новый сезон. Я надеюсь, в лучшую сторону ;-) Но судить конечно вам. Присылайте свои соображения.

Сегодня в рассылке впервые будет затронута тема DirectX (давно пора, надо сказать). И, конечно, вас ждут еще рубрики "Вопрос-Ответ" и "Экзамен".

  • Читать дальше
  • 1
  • ...
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: