捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  粤ICP备10103342号-1 DELPHI盒子 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 盒子检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
盒子资源分类
全部展开 - 全部合拢
DLL中TSpeedButton事件响应示例
关键字:DLL 窗体 TSpeedButton 刷新
来 自:原创
平 台:Win2k/XP/NT,Win2003 下载所需:0 火柴
深浅度:初级 完成时间:2009/9/11
发布者:murphyaefe 发布时间:2009/9/12
编辑器:DELPHI7 语  种:简体中文
分 类:窗体 下载浏览:647/8019
加入到我的收藏
下载错误报错
登陆以后才能下载
 用户名:
 密 码:
自动登陆(30天有效)
图片如果打不开,说明流量不够了,请稍候下载……
TSpeedButton在DLL中无法响应CM_MOUSEENTER,CM_MOUSELEAVE事件详解

使用DELPHI进行DLL开发时,如果在DLL的Form窗体内使用了TSpeedButton控件,便能发现,在运行时TSpeedButton无法响应CM_MOUSEENTER,CM_MOUSELEAVE事件!

首先,跟踪一下VCL源码,发现这两个VCL自定义消息源于TApplication.DoMouseIdle:

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;

DoMouseIdle方法完成了上述消息的发送过程,而该方法由TApplication.Idle调用,Idle是TApplication.HandleMessage的消息处理循环的一部分。最终HandleMessage消息处理循环由TApplication.Run启动;

再来看看TApplication这个类,这个最常用最基础的类在Forms单元定义,但却是在Controls单元中的InitControls方法中被创建,也就是说,只要在DLL中使用Form,TApplication就会被创建!但是这个TApplication却和主程序中的TApplication是两个东西,同时DLL中创建的TApplication对象也不会调用Run方法;
看来,只需要在DLL中构建一个消息循环处理的流程,就可以很好的解决这个问题。
在网络上常用的方法是直接将主程序的TApplication的Handle替换DLL中的Handle,虽然这样一来DLL中的消息可以响应了,但可想而知,被替换后主程序已经无法响应消息。因为主程序接收消息的句柄已经被替换成DLL中的Application.Handle了;

其实,只需要在主程序的消息循环中,加上处理上述鼠标消息的机制,就能很完美的解决上述问题;因此,可以响应主程序的TApplication.OnMessage事件,在该事件中完成DLL的TApplication.DoMouseIdle处理即可;
Google
 
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们
龙脉加密锁 15元起 Grid++Report 报表 申请支付@网
 相关文章
没有相关文章
相关评论
共有评论2条
我要发表评论 查看全部评论
 
  DELPHI盒子版权所有 技术支持:深圳市麟瑞科技有限公司 1999-2024 V4.01 粤ICP备10103342号-1 更新RSS列表