2

我已将图像 ( 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活动。我正在使用德尔福 7。

4

2 回答 2

8

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

无论如何,在现代版本的 Delphi 中,您只需使用OnMouseEnterandOnMouseLeave事件。我不认为这些在 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;

此示例采用插入器类的形式,但当然您最好制作一个适当的子类控件。

于 2013-04-10T19:12:48.343 回答
0

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

但是正如 Andreas已经解释的那样,在鼠标移动事件处理程序中加载图片是很糟糕的。

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

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;
于 2013-04-10T19:49:34.883 回答