unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Label1: TLabel;
  private
    { Private declarations }
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.CMMouseEnter(var Message: TMessage);
begin
        label1.Caption:='in';
end;procedure TForm1.CMMouseLeave(var Message: TMessage);
begin
        label1.Caption:='out';
end;end.
我运行上面程序后,非得按住鼠标不放从窗口外里移动,label才会变,
为什么?不是mouseLeave,鼠标移开就可以了?

解决方案 »

  1.   

    呵。。老大啊。。你是映射的是整个FORM的CM_MOUSEENTER消息,而不是LABEL自己的消息啊.
    不过这样也可以的..这样改一下..
    procedure TForm1.CMMouseEnter(var Message: TMessage);
    begin
      if Integer(Label1)=Message.LParam then
      begin
        Label1.Caption:='in';
      end;
    end;因为窗体上任何一个TCONTROL都会把自己的CM_MOUSEENTER向PARENT传递...procedure TControl.CMMouseLeave(var Message: TMessage);
    begin
      if FParent <> nil then
        FParent.Perform(CM_MOUSELEAVE, 0, Longint(Self));
    end;
      

  2.   

    去看看俺参与的这个帖子:
    http://expert.csdn.net/Expert/topic/1747/1747226.xml?temp=9.144229E-02
      

  3.   

    TO:gwsr(咩咩)
    你那的问题是另一回事,
    从操作系统来看,如果鼠标离开某一个窗口,操作系统便不会传给这窗口鼠标消息,
    除非这个窗口‘抓‘着鼠标。
    同样的,当鼠标离开某应用程序的窗口,当前的应用程序进程便接收不到系统鼠标消息.相信你也注意过,在窗口之间的拖动处理的时候,常要用SetCapture函数来为指定窗口
    抓住鼠标,让鼠标离开窗口也接受到它的消息.(使用HOOK,钩住全局的鼠标消息,那是另一回事,不提)
    CM_MOUSEENTER,CM_MOUSELEAVE产生的思路不同的,它是VCL应用程序在处理空闲时候,
    判断鼠标位置而内部产生的。
      

  4.   

    to  halfdream(哈欠)
    我的本意是鼠标离开窗体时,labe1变成out
    鼠标进入窗体时,label1变成in
    那CMMouseEnter,CMMouseLeave当然是写在整个窗体里了
      

  5.   

    to  halfdream(哈欠)
    按照你的方法是:鼠标移出label时,label显示out,
                    鼠标移入label时,label显示in
    我调试了一下,可以的
    我要实现的是:鼠标离开窗体时,labe1变成out
                  鼠标进入窗体时,label1变成in
    代码就是我上面贴的,但是一定要按住鼠标不放才有效果有什么错误请指出,谢谢了
      

  6.   

    LABEL本身有ONMOUSEENTER和ONMOUSELEAVE的事件..
    我觉得你还是用他本身的好..
      

  7.   

    大家没明白我的意思,不用label看下面一段
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
      private
        { Private declarations }
        procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
        procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.CMMouseEnter(var Message: TMessage);
    begin
            form1.Caption:='Mouse is in then form';
    end;procedure TForm1.CMMouseLeave(var Message: TMessage);
    begin
            form1.Caption:='Mouse out the form';
    end;end.
    程序运行没有达到我预期的结果,还是要按住鼠标移动才会有效果,为什么?
      

  8.   

    // 不用消息可以吗 ?unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls;type
      TForm1 = class(TForm)
        Timer1: TTimer;
        Label1: TLabel;
        procedure Timer1Timer(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Timer1Timer(Sender: TObject);
    var
      Pt : TPoint ;
      Rect : TRect ;
    begin
      GetCursorPos(Pt) ; 
      GetWindowRect(Handle,Rect) ;
      if Not PtInRect(Rect,Pt) then 
        Label1.Caption := 'Out'
      else
        Label1.Caption := 'In' ;
    end;end.
      

  9.   

    Timer1 : Interval = 1 
      

  10.   

    呵。我把问题理解错了。
    先给你一个歪解,放可以接受焦点的一个控件在窗体上,比如放一个TMEMO,不用写什么代码,再运行的程序,看看什么现象。
    当然会有正解,我要想一下