CM_MOUSEENTER 和 CM_MOUSELEAVE 消息分析

本文深入解析了TApplication类中的CM_MOUSEENTER和CM_MOUSELEAVE消息触发机制,详细介绍了如何通过DoMouseIdle函数监测鼠标位置变化,并在鼠标进入或离开控件时发送相应消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在TControl 类中有自定义的消息
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
在我们写控件的时候,可以显示鼠标进入或移除控件的特效
但是CM_MOUSEENTER 和CM_MOUSELEAVE消息是什么时候产生的呢
在Tapplication类中
function TApplication.DoMouseIdle: TControl;
var
  CaptureControl: TControl;
  P: TPoint;
begin
  GetCursorPos(P);
  Result := FindDragTarget(P, True);
  CaptureControl := GetCaptureControl;
  if FMouseControl <> Result then
  begin
    if ((FMouseControl <> nil) and (CaptureControl = nil)) or
      ((CaptureControl <> nil) and (FMouseControl = CaptureControl)) then
      FMouseControl.Perform(CM_MOUSELEAVE, 0, 0);
    FMouseControl := Result;
    if ((FMouseControl <> nil) and (CaptureControl = nil)) or
      ((CaptureControl <> nil) and (FMouseControl = CaptureControl)) then
      FMouseControl.Perform(CM_MOUSEENTER, 0, 0);
  end;
end;

获取鼠标的位置,判断鼠标所在那个控件的范围呢,如果控件改变了,就对这个控件发送

CM_MOUSEENTER,对旧的控件发送CM_MOUSELEAVE。

procedure TApplication.Idle(const Msg: TMsg);
var
  Control: TControl;
  Done: Boolean;
begin
  Control := DoMouseIdle;

DoMouseIdle 是在 Idle函数中调用

继续追踪
procedure TApplication.HandleMessage;
var
  Msg: TMsg;
begin
  if not ProcessMessage(Msg) then Idle(Msg);
end;

这下真相大白了

在没有消息处理的时候,就调用Idle函数,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值