问题描述
我有一个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可以提供这样的东西吗?
有些怀疑我
答案 0 :(得分:4)
不是使用简单的线性刻度,而是可以通过增加与控件的距离来加速变化,并且在过去的位置开始自动递增。基本上它可以像拖动选择文本一样工作,一旦鼠标到达窗口底部,窗口就会开始滚动,即使鼠标到达那个点时停止移动。