如何检测鼠标何时不在控件中?

时间:2013-04-10 19:03:52

标签: image delphi delphi-7 onmousemove

我已将图片(TImage)作为按钮添加到我的程序中。我想添加一些额外的效果,所以在OnMouseMove(每当用户将鼠标移到图像上时),图像被另一个图像替换,以产生额外的效果:

procedure TForm1.Image4MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var 
  Path, Destination: String;
begin
  Path := ParamStr(0);
  Destination := Extractfilepath(Path) + 'Images\Image2.bmp';
  Image4.Picture.LoadFromFile(Destination);
end;

但是每当用户移开鼠标时(当他离开图像时),它都不会撤消完成的事情(更改回Image1)。我该怎么做?没有OnMouseLeave事件。我正在使用delphi 7。

2 个答案:

答案 0 :(得分:8)

首先,你问题中的代码太可怕了!每次光标移动图像控件内的像素时,它都会(重新)加载位图!这就是浪费CPU时间!

无论如何,在现代版本的Delphi中,您只需使用OnMouseEnterOnMouseLeave事件。我不认为Delphi 7中存在这些,所以你必须做这样的事情:

TImage = class(ExtCtrls.TImage)
protected
  procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
  procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
end;

,其中

{ TImage }

procedure TImage.CMMouseEnter(var Message: TMessage);
begin
  // Do something
end;

procedure TImage.CMMouseLeave(var Message: TMessage);
begin
  // Do something else 
end;

此示例采用插入器类的形式,但当然您可能更好地进行正确的子类控制。

答案 1 :(得分:0)

如果在图像控件中加载另一张图片,则之前加载的图片将消失:您必须再次加载它。当鼠标移动到图像的容器上时,你可以这样做,可能是表单本身。

但是在鼠标移动事件处理程序中加载图片与Andreas already explained一样糟糕。

我可以提出替代方案吗?创建两个图像控件并将它们放在同一个位置。然后添加以下处理程序:

procedure TForm1.Image4AMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Image4B.BringToFront;
  Image4B.Tag := 1;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if Image4B.Tag = 1 then
  begin
    Image4B.Tag := 0;
    Image4A.BringToFront;
  end;
end;