下面先用常规方法实现对 Panel1 中的一组 Button 进行调整, 然后再用上面三个函数重新实现.
本例效果图:

代码文件:
unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ExtCtrls;typeTForm1 = class(TForm)Panel1: TPanel;Button1: TButton;Button2: TButton;Button3: TButton;Button4: TButton;RadioButton1: TRadioButton;RadioButton2: TRadioButton;procedure RadioButton1Click(Sender: TObject);procedure RadioButton2Click(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.RadioButton1Click(Sender: TObject); varnum,i: Integer;btn: TButton;L,T,W,H: Integer; beginnum := Panel1.ControlCount;L := 10;T := 10;W := (Panel1.ClientWidth - L * (num+1)) div num;H := (Panel1.ClientHeight - T * (num+1)) div num;for i := 0 to num - 1 dobeginif Panel1.Controls[i] is TButton thenbeginbtn := TButton(Panel1.Controls[i]);btn.Left := L;btn.Top := (H + T) * i + T;btn.Width := W;btn.Height := H;end;end; end;procedure TForm1.RadioButton2Click(Sender: TObject); varnum,i: Integer;btn: TButton;L,T,W,H: Integer; beginnum := Panel1.ControlCount;L := 10;T := 10;W := (Panel1.ClientWidth - L * (num+1)) div num;H := (Panel1.ClientHeight - T * (num+1)) div num;for i := 0 to num - 1 dobeginif Panel1.Controls[i] is TButton thenbeginbtn := TButton(Panel1.Controls[i]);btn.Left := (W + L) * i + L;btn.Top := T;btn.Width := W;btn.Height := H;end;end; end;end.窗体文件:
object Form1: TForm1Left = 0Top = 0Caption = 'Form1'ClientHeight = 220ClientWidth = 307Color = clBtnFaceFont.Charset = DEFAULT_CHARSETFont.Color = clWindowTextFont.Height = -11Font.Name = 'Tahoma'Font.Style = []OldCreateOrder = FalsePixelsPerInch = 96TextHeight = 13object Panel1: TPanelLeft = 8Top = 8Width = 289Height = 161Caption = 'Panel1'TabOrder = 0object Button1: TButtonLeft = 152Top = 72Width = 75Height = 25Caption = 'Button1'TabOrder = 0endobject Button2: TButtonLeft = 160Top = 80Width = 75Height = 25Caption = 'Button2'TabOrder = 1endobject Button3: TButtonLeft = 168Top = 88Width = 75Height = 25Caption = 'Button3'TabOrder = 2endobject Button4: TButtonLeft = 176Top = 96Width = 75Height = 25Caption = 'Button4'TabOrder = 3endendobject RadioButton1: TRadioButtonLeft = 50Top = 183Width = 113Height = 17Caption = 'RadioButton1'TabOrder = 1OnClick = RadioButton1Clickendobject RadioButton2: TRadioButtonLeft = 184Top = 183Width = 113Height = 17Caption = 'RadioButton2'TabOrder = 2OnClick = RadioButton2Clickend end
用 BeginDeferWindowPos、DeferWindowPos、EndDeferWindowPos 重新实现的代码(窗体和运行效果是一样的):
unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ExtCtrls;typeTForm1 = class(TForm)Panel1: TPanel;Button1: TButton;Button2: TButton;Button3: TButton;Button4: TButton;RadioButton1: TRadioButton;RadioButton2: TRadioButton;procedure RadioButton1Click(Sender: TObject);procedure RadioButton2Click(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.RadioButton1Click(Sender: TObject); varnum,i: Integer;btn: TButton;L,T,W,H: Integer;DeferHandle: THandle; beginnum := Panel1.ControlCount;L := 10;T := 10;W := (Panel1.ClientWidth - L * (num+1)) div num;H := (Panel1.ClientHeight - T * (num+1)) div num;DeferHandle := BeginDeferWindowPos(num); {准备调整一组窗口}for i := 0 to num - 1 dobeginif Panel1.Controls[i] is TButton thenbeginbtn := TButton(Panel1.Controls[i]);DeferHandle := DeferWindowPos(DeferHandle,btn.Handle,HWND_TOP, {此参数决定 Z 序}L, (H + T) * i + T, W, H, {新的位置与大小}SWP_NOZORDER {更多控制, 现在是不改变 Z 序});end;end;EndDeferWindowPos(DeferHandle); {实施调整} end;procedure TForm1.RadioButton2Click(Sender: TObject); varnum,i: Integer;btn: TButton;L,T,W,H: Integer;DeferHandle: THandle; beginnum := Panel1.ControlCount;L := 10;T := 10;W := (Panel1.ClientWidth - L * (num+1)) div num;H := (Panel1.ClientHeight - T * (num+1)) div num;DeferHandle := BeginDeferWindowPos(num);for i := 0 to num - 1 dobeginif Panel1.Controls[i] is TButton thenbeginbtn := TButton(Panel1.Controls[i]);DeferHandle := DeferWindowPos(DeferHandle,btn.Handle,HWND_TOP,(W + L) * i + L, T, W, H,SWP_NOZORDER);end;end;EndDeferWindowPos(DeferHandle); end;end.