BeginDeferWindowPos 和 DeferWindowPos、EndDeferWindowPos 是一组一起使用的函数, 可对一组窗口的位置、大小、Z 序等进行调整, 在 ExtCtrls 单元有用到.



下面先用常规方法实现对 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.

转载于:https://www.cnblogs.com/del/archive/2008/10/20/1315054.html

VCL 中的 Windows API 函数(6): BeginDeferWindowPos相关推荐

  1. 在C#中调用windows API函数

    Api函数是构筑Windws应用程序的基石,每一种Windows应用程序开发工具,它提供的底层函数都间接或直接地调用了Windows API函数,同时为了实现功能扩展,一般也都提供了调用Windows ...

  2. Windows API函数速查

    http://blog.csdn.net/ghevinn/article/details/8213614 Windows API函数速查 1. API之网络函数 WNetAddConnection 创 ...

  3. Windows API 函数大全

    Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数  WNetAddConnection 创建同一个网络资源的永久性连接  WNetAddConnection2 创建 ...

  4. Windows API函数大全(方便查找)

    Windows API函数大全 目录 Windows API函数大全 1. API之网络函数 2. API之消息函数 3. API之文件处理函数 4. API之打印函数 5. API之文本和字体函数 ...

  5. WINDOWS API函数说明

    Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数  WNetAddConnection 创建同一个网络资源的永久性连接  WNetAddConnection2 创建 ...

  6. C#中调用Windows API的要点

    在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...

  7. C#中调用Windows API的要点【转载】

    在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...

  8. [收集]Visual C#中调用Windows API

    在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...

  9. 在c#中使用WINDOWS API(转)

    下面以C#为例简单介绍调用API的基本过程: 动态链接库函数的声明 动态链接库函数使用前必须声明,相对于VB,C#函数声明显得更加罗嗦,前者 通过 Api Viewer粘贴以后,可以直接使用,而后者则 ...

最新文章

  1. 一只端午节鸭蛋粽子的背后:AI 与农业
  2. php与js的关系,Php与Js的交互
  3. 《Haskell函数式编程入门》——导读
  4. python面向对象编程之组合
  5. python mysqldb安装_Flask干货:访问数据库——Python数据库框架MySQLPython
  6. 【Verilog语法】分支延迟槽
  7. UNIX环境高级编程笔记
  8. 用友uclient客户端下载手机_影院6080手机版-影院6080手机客户端下载
  9. mysql打错了怎么办_数据库出错了怎么办?
  10. SQLServer中在视图上使用索引(转载)
  11. Android安卓开发-Helloworld
  12. 定时任务Quartz基础
  13. 中国最小黑客:为不做作业 黑掉学校系统
  14. Python(arcpy) 批量shp转raster
  15. 如果你是一个Java面试官,你会问哪些问题?
  16. latex中文编号是问号的问题
  17. 方差齐性检验python实现
  18. .Net CLR运行时是如何编译函数的
  19. php服装商城网站毕业设计源码241505
  20. 控制流分析之构建支配树

热门文章

  1. 辍学的名人_我辍学去追求成为网络开发人员和设计师的梦想
  2. nsq php,Nsq从入门到实践
  3. 联想e580没有声音_现在你可以购买通过 Linux 认证的联想 ThinkPad 和 ThinkStation
  4. 弄懂“进程”(下):进程的控制、同步和通信
  5. (C++)将整型数组所有成员初始化为0的三种简单方法
  6. python 数据类笔试题_一道 Python 类的笔试题详解
  7. JavaScript 复习之数据类型
  8. slurm用户快速入门手册
  9. 大数据流通存隐忧 产业信任体系亟待建立
  10. 搭建Docker私有仓库--自签名方式