![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Затормозить мышку
Чапаев © (2006-12-27 20:29:00)Как бы сделать так, чтобы при "проезде" курсора мышки над контролом её движение "замедлилось"? Пытался в обработчике OnMouseMove делать что-то вроде NewX:=OldX+DeltaX div 2, но при этом курсор или не передвигается вообще, если мышку двигать плавно, или сразу выскакивает за пределы контрола, если двигать резко.
Чапаев (2006-12-30 13:11:00) [1]> [18] -DeBUGGeR- © (30.12.06 12:54)
:-) так и сделал... "Прелесть" в том, что для получения скорости надо передавать @MouseSpeed, а для установки -- Pointer(MouseSpeed). Пока я допёр...
-DeBUGGeR- (2006-12-30 12:54:00) [2]Полубому нужно менять скорость перемещения мыши в системе над контролом, а когда курсор мыши "уйдет с контрола" вернуть настройки обратно.
Если мутить темы с координатами, то мышь начнет дергаться и вообще последствия будут не красивыми (ИМХО).
к примеру с кнопкой Button1 )):
// Обработчик когда курсор над кнопкой
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
SystemParametersInfo(SPI_SETMOUSESPEED,0,pointer(2),SPIF_SENDCHANGE);
end;
// Обьработчик когда курсор над формой
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
SystemParametersInfo(SPI_SETMOUSESPEED,0, pointer(13) ,SPIF_SENDCHANGE);
end;
---------------
все просто прекрасно работает....
Но есть одно НО: надо сделать глобальную переменную и туда сохранять скорость мыши в системе... И когда курсор над формой (или при закрытии ! На всякий случай) ставить "старую" скорость перемещения мыши.
Чапаев (2006-12-30 12:49:00) [3]Короче, [10] -- самое оно. ;-)
Piroxyline (2006-12-30 11:47:00) [4]По GetCursorPos бери позицию курсора, от координат отнимай старые координаты, дели на 2 и прибавляй старые - получишь замедление в 2 раза.
Eraser (2006-12-30 00:03:00) [5]> [13] Чапаев © (29.12.06 19:21)
надо производную от перемещения по времени взять, а потом уменьшить ))
а если серьезно то можно поиграться с SetCursorPos, но там не очень простой алгоритм получится и мыша можеть дергаться... всмысле её указатель )
Kolan (2006-12-29 21:12:00) [6]«Как бы сделать так, чтобы при проезде »
Имхо с координатами сложно. Надо менять настройки мыши. Там есть скорость
Чапаев (2006-12-29 19:21:00) [7]> [9] Elen © (28.12.06 15:27)
Нет
> [11] Джо © (28.12.06 15:39)
Я их хочу изменить для единственного контрола и то -- только на время нахождения над ним курсора.
Elen (2006-12-28 15:41:00) [8]Удалено модератором
Примечание: Флудить завязываем
Джо (2006-12-28 15:39:00) [9]А вообще кошерно ли системные установки на каждый чих менять самопроизвольно?
Elen (2006-12-28 15:36:00) [10]
> Чапаев
Вот :
Для того, чтобы изменить скорость перемещения мыши воспользуйтесь следующим кодом:
SystemParametersInfo(SPI_SETMOUSESPEED,0,pointer(5),SPIF_SENDCHANGE); // где 5 - скорость. (по умолчанию - 10)
Elen (2006-12-28 15:27:00) [11]
> Проблема похоже из-за округления при делении.
Проблема скорее из-за того что если автор пользуется SetCursorPos, то тот при выполнении вызывает OnMouseMove, т.е. зацикливание такое происходит пока мышка за пределы контрола не выдвинется.
megabyte-ceercop (2006-12-28 14:10:00) [12]NewX:= OldX + ((float)DeltaX / 2.0)
сделай OldX типом float
Проблема похоже из-за округления при делении.
Орион (2006-12-28 13:35:00) [13]> [5] Чапаев © (28.12.06 10:02)
тебе в процедуру обработки будут приходить координаты курсора, вот их и меняй.
Котик Б (2006-12-28 11:19:00) [14]А вы не думаете о том - что пользователь встретившийся со столь необычной заботой о себе - вашу программку сразу же сотрет ???
Чапаев (2006-12-28 10:02:00) [15]> [3] Орион © (28.12.06 09:01)
А чем это поможет? Передвижение мышки я и так ловлю. Но вот как его "замедлить" -- идей нету...
> [4] Evgeny V © (28.12.06 09:09)
Судя по описанию, может помочь... Буду пробовать.
Evgeny V (2006-12-28 09:09:00) [16]SystemParametersInfo (возможно, ибо сам не пробовал)
Орион (2006-12-28 09:01:00) [17]> [0] Чапаев © (27.12.06 20:29)
хуком попробуй.
Чапаев (2006-12-28 08:25:00) [18]> SetMousePos
SetCursorPos()
> Только что Вы подразумеваете под "замедлилось"?
Хотелось бы, чтобы над данным контролом курсор передвигался на один пиксель при таком физическом передвижении мышки, которое бы в остальной части экрана передвигало курсор на два (три, четыре, ...) пикселя. Как понятней объяснить, не знаю.
TStas (2006-12-28 01:35:00) [19]SetMousePos? Только что Вы подразумеваете под "замедлилось"?