Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Затормозить мышку


Чапаев ©   (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? Только что Вы подразумеваете под "замедлилось"?


Наверх

Титульная страница Поиск, карта сайта Написать письмо