方法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;
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;
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Perform(WM_SYSCOMMAND,$f012,0);
end;
ReleaseCapture;
SendMessage(Handle, WM_SYSCOMMAND, $F012, 0);
这样就可以了。