继续消息窗口

   今天准备再把消息窗口完善下,算是完工了,结果还是被一个很普通的问题难住了。

   先实现窗口的动画显示,这里没什么,TIMER是最简单的方法,然后是窗口在关闭时的渐隐效果,也没问题,用TIMER照样解决,

如果不用TIMER的话,可以写个循环,在循环里加上application.handlemessage就可以了。

   然后在双击自动创建的LABEL时问题出来了,我同时在LABEL上加入了单击和双击时间,结果双击时间之前总要执行以下单击事件,双击事件倒是没法激发了,在MOUSEDOWN里用shift状态来控制无果,也可能是方法不对,网上有文章说可以。

   然后的方法就是截取WNDPROC,然后分别处理单击和双击的消息,我最不想的就是为这个再重写控件,但不晓得怎么把正确的WNDPROC赋给LABEL,只好用最笨的办法,写了一个类来从TLABEL继承,然后改写WndProc

TLabelEx=class(TLabel)

    procedure WndProc(var msg:TMessage);

end;

代码如下:

 

procedure TLabelEx.WndProc(var msg: TMessage);

var

  Nowtime:Cardinal;

begin

  Nowtime:=GetTickCount;

  with msg do

  begin

    case msg of

      WM_LBUTTONDBLCLK:

        begin

          click_tag:=true;

          self.DblClick;

        end;

      WM_LBUTTONDOWN:

        begin

          click_tag:=false;

          while ((GetTickCount<Nowtime+180) and (not click_tag)) do

          begin

            Application.HandleMessage;

          end;

          if not click_tag then

            self.Click;

        end;

  else

    begin

      try

        Dispatch(msg);

      except

        if Assigned(ApplicationHandleException) then

          Application.HandleException(self);

      end;

    end;

  end;

  end;

end;

 

 

    我在那里单击之后要做个循环,而系统原来的GetDoubleClickTime为500ms,这样等待的时间太长了,能明显感觉到延迟,所以我在每次响应消息时把间隔设为180ms,这样延迟就没那么明显了。

    之前我是定义了一个LBWndProc(var msg:TMessage);

   然后把这个赋给自动创建的LABEL,

      如

      lb_temp.DefWndProc:=LBWndProc;

   但我是把过程写在FORM里面的,结果处理消息的时候,处理全是FORM的消息,总不成去一个个去截取,而别的办法我也没想出来,所以只要用这个笨办法了。

   其实仔细想一下,用赋值的方法应该是可以实现的,我的写法肯定有问题,如果这样写的话,可能也是稍为麻烦,回头再试一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值