![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Плавная промотка
SIV5000 © (2010-06-04 16:51:00)Народ привет. Подскажите как сделать в компоненте плавную прокрутку такую уак в опере. Тоесть при прокурутке колеса скроллбар должен постепенно увеличивать скорость промотки пока не достигнеться конечная точка. Ниже я привел код, который я использую, но проблема в следующем: если быстро прокручивать колесо мыши по много раз вверх-вниз то скролбар не сразу реагирует на команду, а продолжает выполнять все по порядку. Например, крутим вниз 10 раз потом сразу крутим один раз вверх но прога продолжает крутить вниз пока не прокрутит все 10 раз а потом уже будет крутить вверх, хотя должна остановить предыдущую процедуру.
.....
var
sbVert:TScrollBar;
..... WMMouseWheel(var Msg: TWMMouseWheel);
var
newPos: integer;
begin
if Msg.WheelDelta < 0 then begin
if (sbVert.Position = sbVert.Max) then Exit;
for newPos := 10 to 15 do begin
sbVert.Position:= sbVert.Position + 2*newPos;
invalidate;
application.ProcessMessages;
end; end else
if Msg.WheelDelta > 0 then begin
if (sbVert.Position = 0) then Exit;
for newPos := 10 to 15 do begin
sbVert.Position:= sbVert.Position - 2*newPos;
invalidate;
application.ProcessMessages;
end;
Msg.Result:= 1;
RWolf (2010-06-05 22:11:00) [1]
> SIV5000 (05.06.10 21:20) [3]
> Спасибо, попробовал, работает, но как сделать плавную прокрутку?
> Мой вариант может не супер, но делает плавную промотку,
> вот только как решить проблему которую я выше описал?!!
Имхо, для получения именно плавнойпрокрутки нужно смотреть в сторону ScrollWindow.
Sha (2010-06-05 21:52:00) [2]Все дельты в обработчике при получении сообщения суммируешь в некоторой переменной. Если итоговая дельта не ноль и обработчик прокрутки не работает, то запускаешь его. Обработчик прокрутки крутит, пока не обнулит суммарную дельту.
Демо (2010-06-05 21:38:00) [3]Как вариант вижу такое решение - При обработке WMMouseWheel не выполняем обработку сразу же, а накапливаем события например в динамическом массиве.
Включаем для обработки таймер, в обработчике таймера проверяем первый и последний элемент. Если направление отличается, удаляем все первые элементы и меняем направление прокрутки.
Если же направление не поменялось, то обрабатываем первый элемент - прокручиваем, затем удаляем обработанный элемент.
SIV5000 (2010-06-05 21:20:00) [4]Спасибо, попробовал, работает, но как сделать плавную прокрутку? Мой вариант может не супер, но делает плавную промотку, вот только как решить проблему которую я выше описал?!!!!
KilkennyCat (2010-06-04 17:17:00) [5]не, не плавно. Но смысл верный - изменение вращения сбрасывает и меняет счетчик.
KilkennyCat (2010-06-04 17:15:00) [6]V - Скорость.
если V/abs(V) равно WheelDelta/abs(WheelDelta) значит движемся в ту же сторону и V := V + WheelDelta; иначе движемся не в ту сторону, V := WheelDelta;
sbVert.Position:= sbVert.Position + V;