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

use*_*090 2 delphi image onmousemove delphi-7

我把images(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;
Run Code Online (Sandbox Code Playgroud)

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

And*_*and 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;
Run Code Online (Sandbox Code Playgroud)

哪里

{ TImage }

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

procedure TImage.CMMouseLeave(var Message: TMessage);
begin
  // Do something else 
end;
Run Code Online (Sandbox Code Playgroud)

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