【问题标题】:How to move a panel or frame by dragging it or any component inside it?如何通过拖动面板或框架或其中的任何组件来移动面板或框架?
【发布时间】:2014-08-10 12:40:27
【问题描述】:

在白色全屏形式中,我将有来自同一来源的七帧。我想用鼠标移动它们并在退出时保存该位置,以便稍后在同一位置加载。如果我在delphi.about.com 中获得的代码中按住鼠标并移动它,我可以移动它

但是,如果我在该面板中单击 WinControl,我当然不会从面板中获得 OnMouseDown。

如何移动面板(或框架)来移动其中的任何控件,而无需对其拥有的每个组件进行编码?

【问题讨论】:

  • 你没有。您必须检测每个单独子控件上的鼠标活动,然后根据需要操作父面板/框架。
  • 最简单的方法是添加一个透明覆盖层并使用它来处理您的拖动。然后,您找出需要移动的控件并移动那个控件。
  • 您可以禁用子控件。
  • draggable 标签通常用于 jQuery Draggable,而不是通用的“在某个可视控件库中拖动控件”,这就是为什么相关列表都与 Java 和 jQuery 相关(至少我'正在发布此评论)。如果您不确定某个标签是否适用,请不要使用它,发布您的问题,访问一些带有您不确定标签的问题,如果它确实适用,您可以编辑您的问题并添加它。请不要只抓取与您发布的内容模糊相关的任何内容。谢谢。
  • @Graymatter 这是一个开始的地方。我应该使用什么作为透明叠加层?

标签: delphi vcl delphi-xe6


【解决方案1】:

这是一个简单的示例,解释了我所指的叠加层:

TTransparentPanel = class(TPanel)
protected
  procedure WMEraseBkGnd(var msg: TWMEraseBkGnd); message WM_ERASEBKGND;
  procedure CreateParams(var params: TCreateParams); override;
end;

procedure TTransparentPanel.CreateParams(var params: TCreateParams);
begin
  inherited CreateParams(params);
  params.ExStyle := params.ExStyle or WS_EX_TRANSPARENT;
end;

procedure TTransparentPanel.WMEraseBkGnd(var msg: TWMEraseBkGnd);
begin
  SetBkMode (msg.DC, TRANSPARENT);
  msg.result := 1;
end;

在表格中你有这样的东西:

procedure TFormTest.FormCreate(Sender: TObject);
begin
  FTransparentPanel := TTransparentPanel.Create(Self);
  FTransparentPanel.Parent := self;
  FTransparentPanel.Align := alClient;
  FTransparentPanel.Visible := True;
  FTransparentPanel.OnMouseDown := FormMouseDown;
  FTransparentPanel.OnMouseUp := FormMouseUp;
  FTransparentPanel.OnMouseMove := FormMouseMove;
end;

procedure TFormTest.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift:
    TShiftState; X, Y: Integer);
var
  I: Integer;
begin
  // Check if there is a control under X, Y
  FMoveControl := nil;
  for I := 0 to ControlCount - 1 do
  begin
    if Controls[I] <> FTransparentPanel then
    begin
      if (Controls[I].Left <= X) and (Controls[I].Top <= Y) and
         ((Controls[I].Left + Controls[I].Width) >= X) and ((Controls[I].Top + Controls[I].Height) >= Y) then
      begin
        FMoveControl := Controls[I];
        break;
      end;
    end;
  end;
  if Assigned(FMoveControl) then
  begin
    FStartLeft := FMoveControl.Left;
    FStartTop := FMoveControl.Top;
    FStartX := X;
    FStartY := Y;
  end;
end;

procedure TFormTest.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y:
    Integer);
begin
  // Move it
  if Assigned(FMoveControl) then
  begin
    FMoveControl.Left := FStartLeft + (X - FStartX);
    FMoveControl.Top := FStartTop + (Y - FStartY);
  end;
end;

procedure TFormTest.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift:
    TShiftState; X, Y: Integer);
begin
  FMoveControl := nil;
end;

当您移动控件时,它会闪烁一点,但应该让您知道如何继续。

【讨论】:

    猜你喜欢
    • 2019-07-19
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多