Оберните мышь по краям экрана - PullRequest
3 голосов
/ 03 ноября 2010

описание проблемы

У меня есть компонент Delphi. Чтобы установить значение, вы можете нажать и перетащить.

Однако, когда вы достигнете края экрана, вы не сможете идти дальше. Затем вам нужно вернуться к компоненту и перетащить дальше, что не очень удобно для пользователя.

предпочтительное решение

Мне бы хотелось, чтобы курсор мыши обернулся вокруг экрана, если вы дойдете до края, чтобы вы могли продолжать прокручивать значение. 3dsmax широко использует этот тип управления графическим интерфейсом, и мне нравится, как это работает.

В качестве альтернативы, для меня было бы хорошо, если курсор выходит за пределы экрана, но продолжает посылать координаты X / Y, которые находятся за пределами экрана.

что у меня до сих пор

Я знаю, что могу получить / установить текущую позицию мыши с помощью Mouse.CursorPos и ​​что размеры экрана доступны через Screen.Width и Screen.Height.

Приведенный ниже код оборачивает курсор мыши так, как я хочу.

procedure TFormXXXX.YYYYMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  LX, LY: Integer;
begin
  LX := Mouse.CursorPos.X;
  if LX < 1 then
    LX := Screen.Width - 1
  else
    if LX>Screen.Width -2 then
      LX := 0;

  LY := Mouse.CursorPos.Y;
  if LY < 1 then
    LY := Screen.Height - 1
  else
    if LY>Screen.Height -2 then
      LY := 0;

  Mouse.CursorPos := Point(LX, LY);
end;

По-прежнему существует проблема, связанная с тем, что мне приходится «вручную» отслеживать обтекания, чтобы получить правильное смещение от начальной точки, но я найду способ решить эту проблему.

Я просто не знаю, является ли это правильным подходом для этого. Может быть, у кого-то есть опыт или мудрые слова, чтобы сказать об этом ...

главный вопрос

Есть ли проверенный и проверенный общий подход к этому? Возможно, в Windows есть что-то подобное?

некоторые сомнения, что у меня

  • Как это будет вести себя при наличии нескольких мониторов?
  • Что произойдет, если пользователь подключен через медленное (VNC?) Соединение ... будет ли положение курсора всегда достигать 0 или другого крайнего конца экрана?
  • Что произойдет, если в качестве элемента управления вводом используется не мышь, а блокнот или сенсорный экран?
  • Это плохая практика, чтобы изменить положение мыши? Я могу представить, что пользователям не нравится, когда мое приложение портит положение курсора мыши.

1 Ответ

4 голосов
/ 03 ноября 2010

Вместо того, чтобы иметь простую линейную шкалу, вы можете ускорить изменение с увеличением расстояния от элемента управления и иметь отсечку, после которой он начинает увеличиваться автоматически.По сути, это работает как перетаскивание для выделения текста, когда окно начинает прокручиваться, когда мышь достигает нижней части окна, даже если мышь перестает двигаться, как только достигает этой точки.

...