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. springboot~Profile开发环境与单元测试用不同的数据库

    期望 希望开发环境dev用mysql 单元测试使用本机的h2数据库 引入依赖 compile('org.springframework.boot:spring-boot-starter-data-jp ...

  2. 当代前端应该怎么写这个hello world?

    前言 大概16年的时候我们队react进行了简单的学习:从DOM操作看Vue&React的前端组件化,顺带补齐React的demo,当时我们只是站在框架角度在学习,随着近几年前端的变化,想写个 ...

  3. .NET Core 2.2 新增部分功能使用尝鲜

    前言     美国当地时间12月4日,微软2019开发者大会中发布了一系列的重磅消息,包含了软硬件和开源社区的各种好消息是铺天盖地,作为一名普通的开发者,我第一时间下载了 .NET Core 2.2 ...

  4. Odd-e CSD Course Day 5

    因為今天是最後一天了,我趕緊在這次結束前提出一些前一晚上想到的問題 1. 在TDD的循環中有重構,那 DB 也會進行重構嗎? 在TDD 的重構的過程,其實也經常會重構資料庫 , 但重構資料庫這裡有一個 ...

  5. 使用go, gin, gorm编写一个简单的curd的api接口

    go 是一门非常灵活的语言,既具有静态语言的高性能,又有动态语言的开发速度快的优点,语法也比较简单,下面是通过简单的代码实现了一个简单的增删改查 api 接口 hello world 常规版 新建 d ...

  6. js常用JSON数据操作

    JSON字符串: var  str = '{"name": "jack", "age": 13}'; JSON对象: var obj = { ...

  7. IDEA 安装配置可视化 MongDB 插件

    IDEA 安装配置可视化 MongDB 插件 1.安装MongoDB插件 打开 IDEA ,file --> settings --> plugins,在右边搜索栏中输入Mongo,点击 ...

  8. jQuery内容过滤选择器与子元素过滤选择器用法实例分析

    jQuery选择器内容过滤 一.:contains(text) 选择器::contains(text)描述:匹配包含给定文本的元素返回值:元素集合 示例: ? 1 2 $("div.mini ...

  9. Django 传递额外参数及 URL别名

    传递额外参数到视图函数中 在 urls.py 文件中添加下面内容 from django.conf.urls import url urlpatterns = [ url(r'index', view ...

  10. transform 的副作用

    transform是一些效果的集合,主要是移动.旋转.缩放和倾斜这四种基本操作,还可以通过设置matrix矩阵来实现更复杂的效果. 变形transform可以实现2D和3D两种效果. 变形transf ...