根据拖动区域动态调整控件大小
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 是否按下按钮。
您可以拦截 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;
我有一个表单,左边是 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 是否按下按钮。
您可以拦截 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;