【问题标题】:Move borderless form in Firemonkey在 Firemonkey 中移动无边界表单
【发布时间】:2013-03-13 09:49:13
【问题描述】:

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

【问题讨论】:

  • 你也可以使用WM_SYSCOMMAND。没定义,定义吧。
  • 我如何定义WM_SYSCOMMAND
  • @David,我认为所谓的SC_DRAGMOVE 常量中唯一的魔力是 MS 只是忘记将它包含到 winuser 头文件中(因此也记录它)。我不认为它有什么神奇之处。 sma6871,尝试code like this 并可选择将常量移动到常用的位置。
  • @TLama 我的问题是$F012的使用。使用SC_DRAGMOVE 很好。你的代码是用于 VCL 的。 Q 是 FMX。

标签: delphi firemonkey delphi-xe3


【解决方案1】:

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

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

【讨论】:

    【解决方案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;
    

    【讨论】:

    • 谢谢,最后是uses FMX.Platform.Win ;-)
    • $F012 = (SC_MOVE 或 HTCAPTION)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多