我写了一个一个自定义的button控件,并处理了wm_lbuttondown和wm_lbuttonUp两个消息,这两个消息的处理过程就是为button刷上不同的背景图片。然后在Form中,我写了button的Onclick事件的响应,是对数据库操作,比较耗时。问题是:鼠标按下时,button的背景及时更换了,但当鼠标弹起时,背景没有改变,直到对数据库的操作(及OnClick事件的响应)完成。我希望能够在鼠标弹起时 首先执行 wm_lbuttonUp消息的响应,然后才执行 OnClick的响应,应该怎么处理呢?另外,有时候,按钮的OnClick响应已经执行完毕,但是按钮的背景仍未更换,也就是wm_lbuttonUp的响应未被执行,这是怎么回事呢?谢谢!!问题解决的话,愿意多加100分。

解决方案 »

  1.   

    它们的顺序如下,
    procedure TControl.WMLButtonUp(var Message: TWMLButtonUp);
    begin
      inherited;
      if csCaptureMouse in ControlStyle then MouseCapture := False;
      if csClicked in ControlState then
      begin
        Exclude(FControlState, csClicked);
        if PtInRect(ClientRect, SmallPointToPoint(Message.Pos)) then Click;
      end;
      DoMouseUp(Message, mbLeft);
    end;你难道不可改一下在MouseUp里先更改背景,  再执行操作
      

  2.   

    我的意思不是叫改VCL源码你要看明白了
      

  3.   

    To:forgetter() 
    十分感激!
    只是看不太懂?
    MouseCapture := False;? 为什么要设为false?
    Exclude(FControlState, csClicked);?为什么要Exclude?
    DoMouseUp(Message, mbLeft); 鼠标已经弹起了,为什么还要up?可以简单地讲讲这段代码地逻辑 吗?再次感谢!
      

  4.   

    To:forgetter() 
    问题已解决,谢谢你的指点?不知如何加分呢?