我想在鼠标离开和进入窗体时触发这两个消息,用来改变窗体得一些布局,可是鼠标进入窗体上其他控件时也会触发,导致画面闪烁,如何解决?

解决方案 »

  1.   

    判断Msg.LParam是否为0
    procedure TForm1.MouseEnter(var Msg: TMessage);
    begin
      if Msg.LParam = 0 then begin
        ...
      end;
    end;
      

  2.   

    sysu(死树):还是不行啊,这样得话鼠标移到别的控件上还是会触发mouseleave消息有没有别的解决办法?
      

  3.   

    sorry 上面的方法不行:(
      

  4.   

    case msg.Msg of
          CM_MOUSEENTER:
                        begin
                        showmessage('mouse enter');
                        setcapture(Self.Handle);
                        application.ProcessMessages;
                        end;
        end;
      

  5.   

    case msg.Msg of
          CM_MOUSELEAVE:if GetCapture = form1.Handle then
                        begin
                        showmessage('mouse leave');
                        ReleaseCapture;
                        Application.ProcessMessages;
                        end;    end;
      

  6.   

    就是这样,没错,如果了解下这两条VCL自定义消息的实质,理解起来可能就比较容易了http://expert.csdn.net/Expert/TopicView1.asp?id=1604705只要鼠标所在控件发生了改变,就会触发这两条消息一个API这时有用,IsChild
      

  7.   

    楼主的意思是鼠标进/出窗体上的控件时不想处理Form的CM_MOUSEENTER和
    CM_MOUSELEAVE消息,naughtyboy(一切都是为了明天) 的代码中需要再判断一下:var MouseEntered: Boolean;procedure TForm1.MouseEnter(var Msg: TMessage);
    begin
    case msg.Msg of
          CM_MOUSEENTER:
                        begin
                        if not MouseEntered then begin
                          showmessage('mouse enter');
                          MouseEntered := True;
                        end;
                        setcapture(Self.Handle);
                        application.ProcessMessages;
                        end;
        end;
    end;procedure TForm1.MouseLeave(var Msg: TMessage);
    var
      p: TPoint;
      r: TRect;
    begin
    case msg.Msg of
          CM_MOUSELEAVE:if GetCapture = form1.Handle then
                        begin
                        // 如果鼠标从控件移出到窗体就不处理
                        GetCursorPos(p);
                        GetWindowRect(Handle, r);
                        if not PtInRect(r, p) then begin
                          showmessage('mouse leave');
                          MouseEntered := False;
                        end;
                        ReleaseCapture;
                        Application.ProcessMessages;
                        end;    end;
    end;