【问题标题】:How do I detect when the mouse is no longer in a control? [duplicate]如何检测鼠标何时不再处于控件中? [复制]
【发布时间】:2013-04-10 19:03:52
【问题描述】:

我已将图像 (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。

【问题讨论】:

  • 你知道'destination'是'source'的反义词吗?

标签: image delphi delphi-7 onmousemove


【解决方案1】:

首先,您问题中的代码太糟糕了!每次光标在图像控件内移动一个像素时,它将(重新)加载位图!这太浪费 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;

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

【讨论】:

  • 如果您不想派生新类,您也可以将TImage.WindowProc 属性子类化以捕获相同的消息。
【解决方案2】:

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

但是在鼠标移动事件处理程序中加载图片就像 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;

【讨论】:

  • 如果图片周围没有可用空间(或非常狭窄的区域)怎么办?不过,我什至会有点担心我自己的实现,因为如果图像与表单的某个边框对齐,那么光标可以离开整个表单而不会“重置”图片。
  • @AndreasRejbrand 但是除了 InstallLLMouseHook 之外的替代品是什么
  • @Andreas OnMouseLeave 将触发,即使控件与表单边框或其他控件对齐。
  • @NGLN:但旧的 Delphi 版本并没有这样做。我在 Windows 95 的 Delphi 4 上尝试过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多