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:=;
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.

delphi中响应鼠标进入或离开控件的方法的更多相关文章

  1. MFC中 自定义类访问主对话框控件的方法

    之前一直在找有木有好点的方法.现在终于被我找到,收藏之~~~~~~ 在使用mfc的时候经常遇到自定义类访问主对话框控件的问题,例如自定义类中的方法要输出一段字符串到主对话框的EDIT控件.控制对话框的 ...

  2. 关于C#界面开发winform与SharpGL结合鼠标只在OpenGLControl绘图区域显示坐标移动消息响应(鼠标单独在某个控件上的消息响应)

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11773260.html 因为很多时候我们开发画图之类的工具时,鼠标移动之类的,都只想在绘图区域 ...

  3. jQuery学习笔记(在js中增加、删除及定位控件的操作)

    代码内容很多都是从amazeui直接copy过来的,先声明,请不要说在下抄袭- - <!-------------------- HTML代码 ----------------------> ...

  4. delphi附带通用控件安装方法:

    附带通用控件安装方法:----------基本安装1.对于单个控件,Componet-->install component..-->PAS或DCU文件-->install;2.对于 ...

  5. zw版【转发·台湾nvp系列Delphi例程】.NET调用HALCON COM控件内存释放模式

    zw版[转发·台湾nvp系列Delphi例程].NET调用HALCON COM控件内存释放模式 ------------------------------------方法一 :Imports Sys ...

  6. Delphi编程之好用的三方控件

    Delphi的强大与其庞大的组件库息息相关,目前的XE10.1版本已自带FastReport和GDI+等,下面我们来看一下几个非常强大且实用的组件库 一.DevExpress套件 Dev包含Grid. ...

  7. C#中禁止跨线程直接访问控件

    C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它.此时它将会在内部调用ne ...

  8. XCODE中使用Main.Storyboard拉入控件并实现事件(Swift语言)

    如何在XCODE中的Main.Storyboard内拉入控件并实现一个简单的效果呢?本人由于刚接触Swift语言不久,对于IDE的操作还是很生疏,不懂了就在网上参考了网上前辈们的文章.以下我将演示如何 ...

  9. iOS中如何让TextView和TextField控件支持return键收起输入法

    TextView和TextField控件是iOS中负责接收用户输入的控件,那当用户输入完成时怎么收起面板呢? 1.TextView和TextField控件获得焦点之后的第一反应就是弹出输入法面板: 2 ...

随机推荐

  1. 点击菜单选项,右侧主体区新增子界面(Tab)的实现

    今天是2019年小年后一天,还有三天回家过年. 今天记录一下一种前端页面的效果的实现,这种效果很常见,一般用于网站后台系统的前端页面.一般后台系统会分为顶部导航栏,左边的菜单栏和右边的主体区.有一种效 ...

  2. linux 指令备忘

    linux 指令备忘 1.ls [选项] [目录名 | 列出相关目录下的所有目录和文件 -a 列出包括.a开头的隐藏文件的所有文件 -A 通-a,但不列出"."和"..& ...

  3. iOS视频边下载边播放

    随着视频行业的发展,很多用户对于观看体验也有了更高的要求,以前的习惯是下载好了在观看,而现在是希望1分钟都不要等,ZUI好一边看着一边下载,等把这个视频看完也下载完了,也就是我们常说的“视频边下载边播 ...

  4. nginx系列10:通过upstream模块选择上游服务器和负载均衡策略round-robin

    upstream模块的使用方法 1,使用upstream和server指令来选择上游服务器 这两个指令的语法如下图: 示例: 2,对上游服务使用keepalive长连接 负载均衡策略round-rob ...

  5. Web后端 JAVA实现验证码生成与验证功能

    首先,写一个验证码生成帮助类,用来绘制随机字母: <span style="font-size:14px;">import java.awt.Color;  impor ...

  6. nlp中文分词(jieba和pyltp)

    分词是中文自然语言处理的基础.目前常用的分词算法有 1.张华平博士的NShort中文分词算法. 2.基于条件随机场(CRF)的中文分词算法. 这两种算法的代表工具包分别是jieba分词系统和哈工大的L ...

  7. 2D射影几何和变换

    阅读<计算机视觉中的多视图集合> 2D射影几何和变换 2D射影平面 本章的关键是理解线和点的对偶性.从射影平面模型出发,IP^2^内的点(a, b ,c)由IP^3^空间中一条过原点的射线 ...

  8. 人脸检测识别,人脸检测,人脸识别,离线检测,C#源码

    百度网盘地址 微云地址 使用虹软人工智能开放平台技术开发完成

  9. ElasticSearch、Logstash、Kibana 搭建高效率日志管理系统

    ELK (ElasticSearch.LogStash以及Kibana)三者组合是一个非常强大的工具,这里我们来实现监控日志文件并且收到日志到ElasticSearch搜索引擎,利用Kibana可视化 ...

  10. mysql的严格模式与无效字符编码问题

    问题一般格式为: 1366 Incorrect string value: '' for column 1300 Invalid utf8 character string: '' 向mysql插入中 ...