方法1: 欺骗 Windows, 让 Windows 认为点击按钮就像在点击标题栏一样。通过截获 WM_NCHITTEST 消息实现。private
procedure wmNCHITTEST(var msg:twmnchittest);message WM_NCHITTEST;
....
end;procedure TForm1.wmNCHITTEST(var msg:twmnchittest);
begin
  inherited;
  if  // 这里判断是何种消息,当然是你想要的消息,如按钮被单击的消息
  then msg.result:=htcaption;
end;方法2:用记录坐标的方法
先定义两个全局变量: ox, oy: integer;
然后,添加 Form 的鼠标点击和移动的事件:procedure TForm1.Form1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  X1 := X;
  Y1 := Y;
end;procedure TForm1.Form1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssLeft in Shift then
  begin
   Left := Left + X - X1;
   Top  := Top + Y - Y1;
  end;
end;

解决方案 »

  1.   

    torble(阿裕)说的方法是正确的。如果采用第一种方法,移动时窗口会变为虚框;如果用第二种方法,则可以实现以象素为单位的平滑移动。我比较喜欢使用第二种方法。
      

  2.   

    以前贴过的,
    procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
    begin
    ReleaseCapture;
    Perform(WM_SYSCOMMAND,$f012,0);
    end;
      

  3.   

    xzgyb(老达摩) 的方法怎么这么爽啊,爽~!!!!
      

  4.   

    在按钮的MouseDown事件中加入以下语句:
      ReleaseCapture;
      SendMessage(Handle, WM_SYSCOMMAND, $F012, 0);
    这样就可以了。