就是在image控件里开始显示一幅图,鼠标放上显示另一张图
当鼠标离开这个控件后又恢复原来的图
image控件只有onmousemove事件,没有当鼠标离开的事件
我该怎么做?

解决方案 »

  1.   

    //这是利用时间器来完成的代码~~
    //也可以重载控件利用CM_MOUSEENTER和CM_MOUSELEAVE消息~~//....
      private
        { Private declarations }
        FMouseMove: Boolean;
    //....implementation//....procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if FMouseMove then Exit;
      FMouseMove := True;
      Timer1.Interval := 200;
      Timer1.Enabled := True;
      Image1.Picture := Image2.Picture;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      if PtInRect(Image1.BoundsRect, ScreenToClient(Mouse.CursorPos)) then Exit;
      Image1.Picture := Image3.Picture;
      TTimer(Sender).Enabled := False;
      FMouseMove := False;
    end;//....
      

  2.   

    image周围有什么控件?鼠标离开后肯定要移到它的周围控件上去!不可能说跳着走而不经过周围控件,所以你可以在其它控件的OnMouseMove事件中写代码,这不就是Image的OnMouseLeave事件吗?呵呵
      

  3.   

    type
      TImageEx =class(TImage)
      private
        FOnMouseEnter: TNotifyEvent;
        FOnMouseLeave: TNotifyEvent;
        procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
        procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
      published  
        property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
        property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
      end;procedure TImageEx.CMMouseEnter(var Message: TMessage);
    begin
      inherited;
      if Assigned(FOnMouseEnter) then
        FOnMouseEnter(Self);
    end;procedure TImageEx.CMMouseLeave(var Message: TMessage);
    begin
      inherited;
      if Assigned(FOnMouseLeave) then
        FOnMouseLeave(Self);
    end;
      

  4.   

    我比较同意楼上wooden954的看法,既简单又使用,函数重栽,太麻烦了,而且程序的运行效率也成问题。
      

  5.   

    非常谢谢 zswang(伴水清清)
    可以实现了
    ehom(?!) 
    你的代码是什么意思,能解释下吗?我看不大明白
    我会另外给你分的,谢谢
      

  6.   

    "函数重栽,太麻烦了,而且程序的运行效率也成问题。"???晕~~~如果你在VCL中看看这两个自定义消息处理的实质也许就不会有效率低的结论,反而是利用OnMouseMove这种方法在实际开发中问题多多,难道在周围所有控件的OnMouseMove中写代码?不光是周围,还有万一鼠标移的太快的话怎么办,看来是所有控件的OnMouseMove中都要写代码,就完全没有问题了吗?自己试试~~~没别的意思,就是从TImgae派生一个新类,也就是自己写个VCL控件~~~看不明白,找些Delphi的基础书籍补充些基础知识都21世纪了,大家不都是面向对象开发吗?派生一个新类也麻烦吗?是不是要回到面向过程开发的年代~~~