如何通过另一个对象在屏幕上拖动无边框FMX表单?

时间:2013-10-05 11:09:36

标签: delphi user-interface firemonkey delphi-xe3

我正在尝试在屏幕上制作一个可拖动的表单,即我可以抓住它并在屏幕上移动它。它是透明的,没有边框,但是图像可以作为其他控件的背景。我想使用图像的事件来控制表单的拖动。我怎样才能做到这一点?

我找到了具有此TDragObject参数的DragEnter,DragLeave,DragStart方法,我不知道。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

基本上你必须手动完成。

这里有一些带有透明图像(TransImage)的表单的delphi / windows代码,没有边框等 事件采用图像的形式,因此Top&左参考TMainScanForm.Top/Left。

这将使用图像事件拖动表单来检测点击和移动

...

// Mouse Drag Control
MouseDown: Boolean;
TopLeft,
MouseStart: TPoint;

...

procedure TMainScanForm.TransImageMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MouseDown := (Button = mbLeft);
  if MouseDown then
  begin
    MouseStart.X := X;
    MouseStart.Y := Y;
    TopLeft := ClientToScreen(MouseStart);
    TopLeft.X := TopLeft.X - X;
    TopLeft.Y := TopLeft.Y - Y;
    end;
end;

procedure TMainScanForm.TransImageMouseMove( Sender: TObject;
                                  Shift: TShiftState;
                                  X, Y: Integer);
var
  NewPoint: TPoint;
begin
  if MouseDown  then
  begin
    NewPoint.X := X;
    NewPoint.Y := Y;
    NewPoint := ClientToScreen(NewPoint);    // On Screen
    NewPoint.Y := NewPoint.Y - MouseStart.Y; // New Onscreen
    NewPoint.X := NewPoint.X - MouseStart.X;
    Top := NewPoint.Y;
    Left := NewPoint.X;
    Refresh;
  end;
end;

procedure TMainScanForm.TransImageMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MouseDown := False;
end;
相关问题