继续消息窗口

来源:互联网 发布:网络问卷调查兼职 编辑:程序博客网 时间:2024/05/20 18:03

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

   先实现窗口的动画显示,这里没什么,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的消息,总不成去一个个去截取,而别的办法我也没想出来,所以只要用这个笨办法了。

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

原创粉丝点击