我已将图片(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。
答案 0 :(得分:8)
首先,你问题中的代码太可怕了!每次光标移动图像控件内的像素时,它都会(重新)加载位图!这就是浪费CPU时间!
无论如何,在现代版本的Delphi中,您只需使用OnMouseEnter
和OnMouseLeave
事件。我不认为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;