//方案1 利用TLabel透明覆盖在TImage上,实现起来比较简单 procedure TForm1.FormCreate(Sender: TObject); begin Label1.Caption := ''; Label1.Transparent := True; Label1.AutoSize := False; Label1.Parent := Image1.Parent; Label1.BoundsRect := Image1.BoundsRect; Label1.BringToFront; end;procedure TForm1.Label1MouseEnter(Sender: TObject); begin //TODO end;procedure TForm1.Label1MouseLeave(Sender: TObject); begin //TODO end;//方案2 利用TTimer检测鼠标移开 procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin Timer1.Interval := 200; Timer1.Enabled := True; //开始检测 end;function ControlFromPoint(mParent: TWinControl; mPoint: TPoint): TControl; var I: Integer; begin Result := nil; if not Assigned(mParent) then Exit; for I := 0 to mParent.ControlCount - 1 do begin if not mParent.Controls[I].Visible then Continue; if PtInRect(mParent.Controls[I].BoundsRect, mPoint) then begin if mParent.Controls[I] is TWinControl then Result := ControlFromPoint(TWinControl(mParent.Controls[I]), Point(mPoint.X - mParent.Controls[I].Left, mPoint.Y - mParent.Controls[I].Top)); if not Assigned(Result) then Result := mParent.Controls[I]; end; end; end; { ControlFromPoint }procedure TForm1.Timer1Timer(Sender: TObject); begin if ControlFromPoint(Image1.Parent, Mouse.CursorPos) <> Image1 then begin //TODO Timer1.Enabled := False; end; end;
unit MyImage;interface uses buttons,Windows, Messages, Classes, Controls, Forms, Graphics, StdCtrls, ExtCtrls, CommCtrl,dialogs; type TMyImage=class(TImage) private procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; public end; procedure Register; implementationprocedure TMyImage.CMMouseEnter(var Message: TMessage); begin showmessage('enter'); end; procedure TMyImage.CMMouseLeave(var Message: TMessage); begin showmessage('leave'); end; procedure Register; begin RegisterComponents('standard', [TMyImage]); end; end.
procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption := '';
Label1.Transparent := True;
Label1.AutoSize := False;
Label1.Parent := Image1.Parent;
Label1.BoundsRect := Image1.BoundsRect;
Label1.BringToFront;
end;procedure TForm1.Label1MouseEnter(Sender: TObject);
begin
//TODO
end;procedure TForm1.Label1MouseLeave(Sender: TObject);
begin
//TODO
end;//方案2 利用TTimer检测鼠标移开
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Timer1.Interval := 200;
Timer1.Enabled := True; //开始检测
end;function ControlFromPoint(mParent: TWinControl; mPoint: TPoint): TControl;
var
I: Integer;
begin
Result := nil;
if not Assigned(mParent) then Exit;
for I := 0 to mParent.ControlCount - 1 do begin
if not mParent.Controls[I].Visible then Continue;
if PtInRect(mParent.Controls[I].BoundsRect, mPoint) then begin
if mParent.Controls[I] is TWinControl then
Result := ControlFromPoint(TWinControl(mParent.Controls[I]),
Point(mPoint.X - mParent.Controls[I].Left,
mPoint.Y - mParent.Controls[I].Top));
if not Assigned(Result) then Result := mParent.Controls[I];
end;
end;
end; { ControlFromPoint }procedure TForm1.Timer1Timer(Sender: TObject);
begin
if ControlFromPoint(Image1.Parent, Mouse.CursorPos) <> Image1 then
begin
//TODO
Timer1.Enabled := False;
end;
end;
uses buttons,Windows, Messages, Classes, Controls, Forms, Graphics, StdCtrls,
ExtCtrls, CommCtrl,dialogs;
type TMyImage=class(TImage)
private
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
public
end;
procedure Register;
implementationprocedure TMyImage.CMMouseEnter(var Message: TMessage);
begin
showmessage('enter');
end;
procedure TMyImage.CMMouseLeave(var Message: TMessage);
begin
showmessage('leave');
end;
procedure Register;
begin
RegisterComponents('standard', [TMyImage]);
end;
end.
进入Image时用onMouseMove事件,离开Image时用Image周围组件的onMouseMove事件.
不行就自己挂主消息循环,拦WM_MOUSEMOVE消息吧,当鼠标的Point在Image控件的范围内时就触发你的代码,也不难写地
SysUtils, Classes, Controls, ExtCtrls, Messages;type
TMyIimage = class(TImage)
private
FOnMouseLeave: TNotifyEvent;
FOnMouseEnter: TNotifyEvent;
protected
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
published
property OnMouseEnter:TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave:TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
end;procedure Register;implementationprocedure Register;
begin
RegisterComponents('Samples', [TMyIimage]);
end;{ TMyIimage }procedure TMyIimage.CMMouseEnter(var Message: TMessage);
begin
inherited;
if Assigned(FOnMouseEnter) then
FOnMouseEnter(self);
end;procedure TMyIimage.CMMouseLeave(var Message: TMessage);
begin
inherited;
if Assigned(FOnMouseLeave) then
FOnMouseLeave(self);
end;end.