如何检测我是否在 mousemove 事件中将鼠标移动到 TImage 组件内的左、右、上或下?
How detect if i'm moving mouse to left, right, top or bottom inside TImage component on mousemove event?
我想知道如何在 mousemove
事件中检测我将鼠标移动到哪一侧:向左、向右、顶部、底部在 TImage 组件内?
谢谢。
这是一个在 FMX
项目中使用的示例。对于 VCL
项目,您将使用整数变量。
首先,例如在表单的私有部分声明两个变量Xold, Yold: single;
。
private
Xold, Yold: Single;
初始化这些变量,例如在表单 OnCreate()
事件中。使用 NaN
需要在 uses 子句中使用 System.Math
。
procedure TForm5.FormCreate(Sender: TObject);
begin
Xold := NaN;
Yold := NaN;
end;
然后在OnMouseMove()
事件中,计算横向和纵向的移动量,负值表示向左或向上移动,正值表示向右或向下移动。
procedure TForm5.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Single);
var
horz, vert: Single;
begin
if not IsNan(Xold) then horz := X - Xold else horz := 0;
if not IsNan(Yold) then vert := Y - Yold else vert := 0;
Xold := X; // save new values
Yold := Y; //
// use horz and vert as needed
Label1.Text := Format('h: %f, v: %f',[horz, vert]);
end;
您可能还想在鼠标离开图像时将 Xold
和 Yold
变量重置为 NaN
。
procedure TForm5.Image1MouseLeave(Sender: TObject);
begin
Xold := NaN;
Yold := NaN;
end;
有人在评论中问到,为什么初始化为 NaN
而不是零? Xold := 0; Yold := 0
是左上角。如果鼠标进入图像发生在例如右侧,第一步是从 0 跳到图像宽度。使用 NaN
我们可以省略第一个条目作为移动,只需将入口点存储在 Xold
和 Yold
中以供下一步移动使用。
我想知道如何在 mousemove
事件中检测我将鼠标移动到哪一侧:向左、向右、顶部、底部在 TImage 组件内?
谢谢。
这是一个在 FMX
项目中使用的示例。对于 VCL
项目,您将使用整数变量。
首先,例如在表单的私有部分声明两个变量Xold, Yold: single;
。
private
Xold, Yold: Single;
初始化这些变量,例如在表单 OnCreate()
事件中。使用 NaN
需要在 uses 子句中使用 System.Math
。
procedure TForm5.FormCreate(Sender: TObject);
begin
Xold := NaN;
Yold := NaN;
end;
然后在OnMouseMove()
事件中,计算横向和纵向的移动量,负值表示向左或向上移动,正值表示向右或向下移动。
procedure TForm5.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Single);
var
horz, vert: Single;
begin
if not IsNan(Xold) then horz := X - Xold else horz := 0;
if not IsNan(Yold) then vert := Y - Yold else vert := 0;
Xold := X; // save new values
Yold := Y; //
// use horz and vert as needed
Label1.Text := Format('h: %f, v: %f',[horz, vert]);
end;
您可能还想在鼠标离开图像时将 Xold
和 Yold
变量重置为 NaN
。
procedure TForm5.Image1MouseLeave(Sender: TObject);
begin
Xold := NaN;
Yold := NaN;
end;
有人在评论中问到,为什么初始化为 NaN
而不是零? Xold := 0; Yold := 0
是左上角。如果鼠标进入图像发生在例如右侧,第一步是从 0 跳到图像宽度。使用 NaN
我们可以省略第一个条目作为移动,只需将入口点存储在 Xold
和 Yold
中以供下一步移动使用。