Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > События начала и конца прокрутки в ListView


Автор: Ne1tr1n0 6.9.2012, 14:55
Добрый день!

Собсна вот вопрос: возможно ли перехватить события начала и конца вертикальной прокрутки в ListView?
Первое что нарыл в гугле это уведомления LVN_BEGINSCROLL и LVN_ENDSCROLL. Решил попробовать их обработать - результат оказался не тем, которого я ждал. Возможно я конечно неправильно их обрабатывал (поскольку уведомления шлются родителю ListView то у формы прописал обработчик WM_NOTIFY и в нем уже проверял Msg.NMHdr.code). 
Ещё вариант - обрабатывать WM_VSCROLL у самого ListView и проверять ScrollCode на SB_ENDSCROLL, но остается вопрос, как определить начало скроллинга? 
Или даже черт бы с ним с началом, но при прокрутке ListView колесом мыши WM_VSCROLL не приходит. Приходят события WM_MOUSEWHEEL как с ними быть я пока не представляю. Разве что как-нить дельту считать?
Кто-нить сталкивался с подобной задачей?

Спасибо.

Автор: MetalFan 7.9.2012, 10:59
Ne1tr1n0, А если не секрет, изначально какая задача решается?

Автор: Ne1tr1n0 7.9.2012, 13:49
smile да я всё с тумбами воюю, хотел сделать чтоб было "ну ващпе-ващпе" красиво. Думал реализовать как в проводнике, открыли папку - поехали генерироваться миниатюры, но процесс может затянуться, а хочется к примеру посмотреть сперва картинки в конце списка файлов, ессно перематываем ListView в конец списка файлов (в середину, на три четверти - не важно по сути), поскольку список и иконки уже есть. И как только перемотка остановилась (событие конца прокрутки сработало), мы в событии конца прокрутки создаем ещё один поток для получения миниатюр, но указываем ему стартовый индекс имени файла для которого надо сгенерить тумбу. Индекс определяем с помощью 
Код

ListView.GetNearestItem(Point(0, 0), sdLeft).Index
здесь мы получаем первый видимый итем в окне ListView.
Собсна вот.
Правда я не особо представляю пока как можно определить конец прокрутки колеса мыши, разве что по таймеру как-нить. Ну или на основании каких-нить операций с дельтой.

Автор: MetalFan 7.9.2012, 17:28
хм.. а может просто по таймеру проверять, что изменился первый отображаемый элемент? раз в 500-1000мсек к примеру. и запускать генерацию тумбов видимой области.

Автор: Ne1tr1n0 8.9.2012, 10:51
Я тут подумываю о том, чтобы просто запретить прокрутку колесиком (в обработке WM_MOUSEWHEEL Msg.Result:=1), потому что по большому счету SB_ENDSCROLL меня полностью устраивает. Но это конечно не лучшее решение.

Автор: bems 10.9.2012, 11:04
Основывайся на событии перерисовки итема.
Если наступило событие о перерисовке и миниатюра для него еще не создана, то переместить этот итем в списке на генерацию миниатюры в самое начало

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)