代码之家  ›  专栏  ›  技术社区  ›  Wouter van Nifterick Andrey

在屏幕边缘环绕鼠标

  •  3
  • Wouter van Nifterick Andrey  · 技术社区  · 14 年前

    问题描述

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

    但是,当你到达屏幕的边缘时,你不能再往前走了。然后,您需要返回到组件并进一步拖动,这不是非常友好的用户界面。

    优选方案

    或者,如果光标离开屏幕,但继续发送超出屏幕边界的X/Y坐标,对我来说也没问题。

    我知道我可以通过mouse.CursorPos获取/设置当前鼠标位置,屏幕尺寸可以通过screen.Width和screen.Height获得。

    下面的代码确实按照我想要的方式包装mousecursor。

    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;
    

    仍然有一个问题,我必须“手动”跟踪包装,以获得一个适当的偏移起点,但我会找到一个办法来解决这个问题。

    主要问题

    有没有一个经过测试的通用方法来解决这个问题?

    我有些怀疑

    • 如果用户通过慢速(VNC)连接,会发生什么情况连接。。光标位置是否总是达到0或屏幕的另一端?
    • 如果输入控件不是鼠标,而是画板或触摸屏,会发生什么?
    • 改变鼠标位置是不是不好?我可以想象用户不喜欢我的应用程序弄乱他们的鼠标光标位置。
    1 回复  |  直到 14 年前
        1
  •  4
  •   Zoë Peterson RRUZ    14 年前

    与简单的线性比例不同,您可以随着与控件的距离的增加而加速更改,并在其开始自动递增的过去设置一个截止点。基本上让它像拖动选择文本那样工作,当鼠标到达窗口底部时,窗口开始滚动,即使鼠标到达该点后停止移动。