在Firemonkey中移动无边框表单

时间:2013-03-13 09:49:13

标签: delphi firemonkey delphi-xe3

在VCL表单中我使用 WM_SYSCOMMAND ,但在firemonkey中它是未声明的。

我测试了这段代码:

procedure TForm4.dragPanelMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  isDraging := true;
  X0 := X;
  Y0 := Y;
end;

procedure TForm4.dragPanelMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Single);
begin
  if isDraging then
  begin
    Form4.Left := Trunc(Form4.Left + X - X0);
    Form4.Top := Trunc(Form4.Top + Y - Y0);
  end;
end;

procedure TForm4.dragPanelMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  isDraging := False;
end;

这可行,但只是为了缓慢的动作!!!

如何在Firemonkey中移动表单?

2 个答案:

答案 0 :(得分:8)

使用Form的StartWindowDrag方法更容易。这样它既可以在Windows和MacOS中使用,也可以在一行代码中使用。像这样:

procedure TForm4.dragPanelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
    Self.StartWindowDrag;
end;

答案 1 :(得分:1)

如果要复制的VCL代码是:

SendMessage(MyForm.Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);

那么FMX的等价物将是:

SendMessage(FmxHandleToHWND(MyForm.Handle), WM_SYSCOMMAND, SC_DRAGMOVE, 0);

原因是MyForm.Handle是FMX句柄。这与窗口手柄不同。您转换为FmxHandleToHWND()的窗口句柄。

您可能需要声明几个常量:

const
  WM_SYSCOMMAND = $0112;
  SC_DRAGMOVE = $F012;