3

问题描述

我有一个 Delphi 组件。要设置值,您可以单击并拖动。

但是,当您到达屏幕边缘时,您将无法再往前走。然后您需要返回组件并进一步拖动,这不是很人性化。

首选解决方案

如果您到达边缘,我想要的是让鼠标光标环绕屏幕,这样您就可以继续滚动一个值。3dsmax 广泛使用这种类型的 GUI 控件,我喜欢它的工作方式。

或者,如果光标离开屏幕,但继续发送超出屏幕范围的 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 或屏幕的另一端?
  • 如果输入控件不是鼠标,而是画板或触摸屏,会发生什么?
  • 更改鼠标位置是不好的做法吗?我可以想象用户不喜欢我的应用程序弄乱他们的鼠标光标位置。
4

1 回答 1

4

您可以通过与控件的距离增加来加速更改,而不是使用简单的线性刻度,并在超过它开始自动递增的地方设置一个截止点。基本上让它像拖动以选择文本一样工作,一旦鼠标到达窗口底部,窗口就会开始滚动,即使鼠标到达该点后停止移动。

于 2010-11-03T19:54:04.690 回答