我这个窗体没有边框,我在bottom位置添加了一个panel想代替以前的标题栏,如何实现我鼠标放在标题栏panel的时候,能够移动整个窗体?

解决方案 »

  1.   

    procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      //if (y<21) and (y>0) then begin
        ReleaseCapture;
        Perform(WM_SYSCOMMAND,$f012,0);
      //end;
    end;
      

  2.   

    从那里拷贝过来的,WM_SYSCOMMAND系统里根本就没有
      

  3.   

    全局申明var
      MouseDownPos:Tpoint;
      FormPos:Tpoint;   
    Panel的MouseDown事件procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
       CurrentPos:Tpoint;
    begin
    FormPos.Y:=form1.Top;
    FormPos.X:=form1.Left;MouseDownPos.X:=X;
    MouseDownPos.Y:=Y;MouseDownPos:=Panel1.clienttoscreen(MouseDownPos);timer1.Enabled:=true;
    end;
    MouseUp事件procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
    timer1.Enabled:=false;
    end;   
    放个timer,触发100ms,起始enable为false。触发事件代码procedure TForm1.Timer1Timer(Sender: TObject);
    var
       CurrentPos:Tpoint;
    begin
    GetCursorPos(CurrentPos);form1.Top:=FormPos.Y+CurrentPos.Y-MouseDownPos.Y;
    form1.Left:=FormPos.X+CurrentPos.X-MouseDownPos.X;        
    end;  
      

  4.   


    uses Messages; 就有了这个方法比我的好
      

  5.   

    MouseDown 事件
    begin
      ReleaseCapture;
      SendMessage(self.Handle, WM_SYSCOMMAND,SC_MOVE+HTCAPTION, 0);
    end;
      

  6.   

    procedure Tf_mainForm.wmnchittest(var msg: Twmnchittest);
    var
      r: Trect;
      p: Tpoint;
    begin
      inherited;
      p.X := image1.Width-image2.Width;
      p.Y := 0;
      p :=  image1.ClientToScreen(p);
      r.TopLeft := p;
      p.X := image1.Width;
      p.Y := image2.Height;
      p := image1.ClientToScreen(p);
      r.BottomRight := p;
      if (msg.XPos<r.Left) or( msg.YPos>r.Bottom) then
      begin
        if (htclient = msg.Result) then 
          msg.Result := htcaption;
      end;
    end;
      

  7.   

    procedure wmnchittest(var msg: Twmnchittest);message wm_nchittest;
      

  8.   

    基本也不需要 timer,太耗时间片。可跨平台的代码为:var
      md: boolean;
      x0, y0: Integer;procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      md := True;
      x0 := X;
      y0 := Y;
    end;procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    begin
      if md then
      begin
        Left := Left - x0 + X;
        Top := Top - y0 + Y;
      end;
    end;procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      md := False;
    end;