如何检测我是否在 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;

您可能还想在鼠标离开图像时将 XoldYold 变量重置为 NaN

procedure TForm5.Image1MouseLeave(Sender: TObject);
begin
  Xold := NaN;
  Yold := NaN;
end;

有人在评论中问到,为什么初始化为 NaN 而不是零? Xold := 0; Yold := 0 是左上角。如果鼠标进入图像发生在例如右侧,第一步是从 0 跳到图像宽度。使用 NaN 我们可以省略第一个条目作为移动,只需将入口点存储在 XoldYold 中以供下一步移动使用。