根据拖动区域动态调整控件大小

Dynamically resize controls based on drag area

我有一个表单,左边是 TTreeview,右边是 TGroupbox。通过拖动右边缘来调整窗体大小时,我希望 Groupbox 相应地增大或缩小。当在左侧拖动表单时,我希望调整 Treeview 的大小。我尝试了下面的代码,正确调整大小效果很好。但是向左调整大小会导致树视图变得比它应该的更长。完成此任务的正确方法是什么?

procedure TForm1.FormResize(Sender: TObject);
var
  p: TPoint;
begin
  P:= ScreenToClient(Mouse.CursorPos);
  if(P.X<0) then begin
    Treeview1.Anchors:= [akLeft,akTop,akRight,akBottom];
    Groupbox1.Anchors:= [akTop,akBottom];
  end
  else begin
    Treeview1.Anchors:= [akLeft,akTop,akBottom];
    Groupbox1.Anchors:= [akLeft,akTop,akRight,akBottom];
  end;
end;

我想你在调整左侧 window 大小时忘记将 Groupbox 锚定到右侧。

procedure TForm1.FormResize(Sender: TObject);
var
  p: TPoint;
begin
  if GetAsyncKeyState(VK_LBUTTON) and 00 <> 0 then exit;
  P:= ScreenToClient(Mouse.CursorPos);
  if(P.X<0) then begin
    Treeview1.Anchors:= [akLeft, akTop, akRight, akBottom];
    Groupbox1.Anchors:= [akTop, akRight, akBottom];
  end
  else begin
    Treeview1.Anchors:= [akLeft, akTop, akBottom];
    Groupbox1.Anchors:= [akLeft, akTop, akRight, akBottom];
  end;
end;

我试过了,它似乎做你想做的事

编辑:

你也可以使用Align 属性(注意顺序,最后有'alClient'值的组件):

procedure TForm1.FormResize(Sender: TObject);
var
  p: TPoint;
begin
  if GetAsyncKeyState(VK_LBUTTON) and 00 <> 0 then exit;
  P:= ScreenToClient(Mouse.CursorPos);
  if(P.X<0) then begin        
    Groupbox1.Align:= alRight;
    Treeview1.Align:= alClient;
  end
  else begin
    Treeview1.Align:= alLeft;
    Groupbox1.Align:= alClient;
  end;
end;

编辑 2:检查鼠标左键的状态

您可以使用Winapi的GetAsyncKeyState(vKey)函数查看按钮或按键的状态。 returns SmallInt 中的按钮状态,位 15 0/1 是否按下按钮。

GetAsyncKeyState

您可以拦截 WM_SIZING 消息而不是处理 OnResize 事件

Sent to a window that the user is resizing. By processing this message, an application can monitor the size and position of the drag rectangle and, if needed, change its size or position.

它的 wParam 值准确地告诉您 window 的哪些边缘正在调整大小。您可以使用它来相应地调整 Anchors,例如:

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    GroupBox1: TGroupBox;
  private
    { Private declarations }
    procedure WMSizing(var Message: TMessage); message WM_SIZING;
  public
    { Public declarations }
  end;

...

procedure TForm1.WMSizing(var Message: TMessage);
var
  TreeViewAnchors: TAnchors;
  GroupBoxAnchors: TAnchors;
begin
  inherited;

  TreeViewAnchors := [akTop, akBottom];
  GroupBoxAnchors := [akTop, akBottom];

  case Message.WParam of
    WMSZ_LEFT, WMSZ_BOTTOMLEFT, WMSZ_TOPLEFT: begin
      TreeViewAnchors := TreeViewAnchors + [akLeft, akRight];
      GroupBoxAnchors := GroupBoxAnchors + [akRight];
    end;
    WMSZ_RIGHT, WMSZ_BOTTOMRIGHT, WMSZ_TOPRIGHT: begin
      TreeViewAnchors := TreeViewAnchors + [akLeft];
      GroupBoxAnchors := GroupBoxAnchors + [akLeft, akRight];
    end;
  end;

  TreeView1.Anchors := TreeViewAnchors;
  GroupBox1.Anchors := GroupBoxAnchors;
end;