Delphi没有MouseEnter与MouseLeave的事件,网上说可以响应CM_MOUSEENTER和CM_MOUSELEAVE消息来实现。这两个消息是VCL自己定义的消息,看了Delphi的Controls.pas果然看到有以下两行:
CM_MOUSEENTER = CM_BASE + 19;
CM_MOUSELEAVE = CM_BASE + 20;
其中CM_BASE = $B000
可以有两种方式来利用:
方式一:在自定义的控件中添加响应事件来实现
方式二:直接让窗体响应事件,然后判断不同的控件
以下代码从网上参考后修改并运行通过。
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TMyPanel=class(tpanel) public procedure MSGEnter(var msg:TMessage);message CM_MOUSEENTER;//响应进入的消息 procedure MSGLeave(var msg: TMessage);message CM_MOUSELEAVE;//响应离开的消息 end; TForm1 = class(TForm) Panel1: TPanel; Panel2: TPanel; procedure FormCreate(Sender: TObject); private MYpanel:TMyPanel; panel:tpanel; procedure MSGEnter(var msg:TMessage);message CM_MOUSEENTER;//响应进入的消息 procedure MSGLeave(var msg: TMessage);message CM_MOUSELEAVE;//响应离开的消息 { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} //方式一:对自定义控件定义事件 { TMyPanel } procedure TMyPanel.MSGEnter(var msg: TMessage); begin Color:=clyellow; end; procedure TMyPanel.MSGLeave(var msg: TMessage); begin Color:=clred; end; { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin MyPanel:=TMyPanel.Create(self); MyPanel.Parent:=self; MyPanel.Caption:='鼠标进入变黄, 鼠标离开变红'; Panel:=TPanel.Create(self); Panel.Parent:=self; panel.top:=100; end; //方式二:用窗体事件事响应并进行判断 procedure TForm1.MSGEnter(var msg: TMessage); var myobj : TObject; begin myobj := TObject(msg.LParam);//用LParam进行判断鼠标进入了哪个控件 if (myobj <> nil) and (myobj is TPanel) then TPanel(myobj).Caption := 'enter'; end; procedure TForm1.MSGLeave(var msg: TMessage); var myobj : TObject; begin myobj := TObject(msg.LParam); if (myobj <> nil) and (myobj is TPanel) then TPanel(myobj).Caption := 'leave'; end; end.
如果想在设计阶段能直接添加事件以做响应,可以自定义控件并将其注册为可视化控件。
方法如下:(以下代码未经测试)
unit MyEdit; interface uses Classes, Controls, Messages, StdCtrls; type TMyEdit = class(TEdit) private FOnMouseLeave: TNotifyEvent; FOnMouseEnter: TNotifyEvent; published property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter; property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave; procedure CMMouseEnter(var Msg:TMessage);message CM_MOUSEENTER; procedure CMMouseLeave(var Msg:TMessage);message CM_MOUSELEAVE; end; procedure Register; implementation procedure Register; begin RegisterComponents('Standard', [TMyEdit]); end; { TMyEdit } procedure TMyEdit.CMMouseEnter(var Msg: TMessage); begin inherited; if Assigned(FOnMouseEnter) then FOnMouseEnter(Self); end; procedure TMyEdit.CMMouseLeave(var Msg: TMessage); begin inherited; if Assigned(FOnMouseLeave) then FOnMouseLeave(Self); end; end.