delphi中响应鼠标进入或离开控件的方法

Delphi没有MouseEnter与MouseLeave的事件,网上说可以响应CM_MOUSEENTER和CM_MOUSELEAVE消息来实现。这两个消息是VCL自己定义的消息,看了Delphi的Controls.pas果然看到有以下两行:

  CM_MOUSEENTER             = CM_BASE + 19;
  CM_MOUSELEAVE             = CM_BASE + 20;

其中CM_BASE = $B000

可以有两种方式来利用:

方式一:在自定义的控件中添加响应事件来实现

方式二:直接让窗体响应事件,然后判断不同的控件

以下代码从网上参考后修改并运行通过。

[delphi]  view plain  copy
  1. unit Unit1;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  7.   Dialogs, ExtCtrls;  
  8.   
  9. type  
  10.   TMyPanel=class(tpanel)  
  11.   public  
  12.     procedure MSGEnter(var msg:TMessage);message CM_MOUSEENTER;//响应进入的消息  
  13.     procedure MSGLeave(var msg: TMessage);message CM_MOUSELEAVE;//响应离开的消息  
  14.   end;  
  15.   
  16.   TForm1 = class(TForm)  
  17.     Panel1: TPanel;  
  18.     Panel2: TPanel;  
  19.     procedure FormCreate(Sender: TObject);  
  20.   private  
  21.     MYpanel:TMyPanel;  
  22.     panel:tpanel;  
  23.     procedure MSGEnter(var msg:TMessage);message CM_MOUSEENTER;//响应进入的消息  
  24.     procedure MSGLeave(var msg: TMessage);message CM_MOUSELEAVE;//响应离开的消息  
  25.     { Private declarations }  
  26.   public  
  27.     { Public declarations }  
  28.   end;  
  29.   
  30.   
  31. var  
  32.   Form1: TForm1;  
  33.   
  34. implementation  
  35.   
  36. {$R *.dfm}  
  37. //方式一:对自定义控件定义事件  
  38. { TMyPanel }  
  39. procedure TMyPanel.MSGEnter(var msg: TMessage);  
  40. begin  
  41.   Color:=clyellow;  
  42. end;  
  43. procedure TMyPanel.MSGLeave(var msg: TMessage);  
  44. begin  
  45.   Color:=clred;  
  46. end;  
  47.   
  48. { TForm1 }  
  49. procedure TForm1.FormCreate(Sender: TObject);  
  50. begin  
  51.   MyPanel:=TMyPanel.Create(self);  
  52.   MyPanel.Parent:=self;  
  53.   MyPanel.Caption:='鼠标进入变黄,  鼠标离开变红';  
  54.   
  55.   Panel:=TPanel.Create(self);  
  56.   Panel.Parent:=self;  
  57.   panel.top:=100;  
  58. end;  
  59.   
  60.   
  61. //方式二:用窗体事件事响应并进行判断  
  62. procedure TForm1.MSGEnter(var msg: TMessage);    
  63. var    
  64.   myobj : TObject;    
  65. begin    
  66.   myobj := TObject(msg.LParam);//用LParam进行判断鼠标进入了哪个控件     
  67.   if (myobj <> niland (myobj is TPanel) then    
  68.     TPanel(myobj).Caption := 'enter';    
  69. end;    
  70.     
  71. procedure TForm1.MSGLeave(var msg: TMessage);    
  72. var    
  73.   myobj : TObject;    
  74. begin    
  75.     myobj := TObject(msg.LParam);    
  76.   if (myobj <> niland (myobj is TPanel) then    
  77.     TPanel(myobj).Caption := 'leave';    
  78. end;  
  79.   
  80.   
  81. end.  


如果想在设计阶段能直接添加事件以做响应,可以自定义控件并将其注册为可视化控件。

方法如下:(以下代码未经测试)

[delphi]  view plain  copy
  1. unit MyEdit;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.    Classes, Controls, Messages, StdCtrls;  
  7.   
  8. type  
  9.   TMyEdit = class(TEdit)  
  10.   private  
  11.     FOnMouseLeave: TNotifyEvent;  
  12.     FOnMouseEnter: TNotifyEvent;  
  13.   published  
  14.     property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;  
  15.     property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;  
  16.     procedure CMMouseEnter(var Msg:TMessage);message CM_MOUSEENTER;  
  17.     procedure CMMouseLeave(var Msg:TMessage);message CM_MOUSELEAVE;  
  18.   end;  
  19.   
  20. procedure Register;  
  21.   
  22. implementation  
  23.   
  24. procedure Register;  
  25. begin  
  26.   RegisterComponents('Standard', [TMyEdit]);  
  27. end;  
  28.   
  29. { TMyEdit }  
  30.   
  31. procedure TMyEdit.CMMouseEnter(var Msg: TMessage);  
  32. begin  
  33.   inherited;  
  34.   if Assigned(FOnMouseEnter) then  
  35.     FOnMouseEnter(Self);  
  36. end;  
  37.   
  38. procedure TMyEdit.CMMouseLeave(var Msg: TMessage);  
  39. begin  
  40.   inherited;  
  41.   if Assigned(FOnMouseLeave) then  
  42.     FOnMouseLeave(Self);  
  43. end;  
  44.   
  45. end.  
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值