1

在 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 中移动表单?

4

2 回答 2

11

更简单的是使用 Form 的 StartWindowDrag 方法。这样它就可以在 Windows 和 MacOS 中运行,而且它只有 1 行代码。像这样:

procedure TForm4.dragPanelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
    Self.StartWindowDrag;
end;
于 2014-02-20T06:20:53.090 回答
2

如果您要复制的 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;
于 2013-03-13T13:14:50.380 回答