首页 > 系统相关 >VCL 中的 Windows API 函数: BeginDeferWindowPos

VCL 中的 Windows API 函数: BeginDeferWindowPos

时间:2023-05-13 11:25:18浏览次数:43  
标签:BeginDeferWindowPos num Windows end API Panel1 btn DeferHandle TButton

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



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

用 BeginDeferWindowPos、DeferWindowPos、EndDeferWindowPos 重新实现的代码(窗体和运行效果是一样的):


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = 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;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.RadioButton1Click(Sender: TObject);
var
  num,i: Integer;
  btn: TButton;
  L,T,W,H: Integer;
  DeferHandle: THandle;
begin
  num := 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 do
  begin
    if Panel1.Controls[i] is TButton then
    begin
      btn := 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);
var
  num,i: Integer;
  btn: TButton;
  L,T,W,H: Integer;
  DeferHandle: THandle;
begin
  num := 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 do
  begin
    if Panel1.Controls[i] is TButton then
    begin
      btn := 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.

 

标签:BeginDeferWindowPos,num,Windows,end,API,Panel1,btn,DeferHandle,TButton
From: https://www.cnblogs.com/lucken2000/p/17396976.html

相关文章

  • VCL 中的 Windows API 函数: AlphaBlend
    AlphaBlend是指定图像混合透明的函数,在Graphics、GraphUtil、RibbonStyleActnCtrls单元用到.下面的测试是把一张图片显示在窗体,并可以调整透明度.、 unitUnit1;interfaceuses Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms, ......
  • 5-12|etcd api常用操作
    如果需要使用v2versionapi,启动etcd时候需要加入“ETCD_ENABLE_V2=true”参数,否则会报错“404pagenotfound”获取etcd信息版本信息#curl-Lhttp://172.16.101.55:2379/version{"etcdserver":"3.4.1","etcdcluster":"3.4.0"}健康状态#curl-Lhttp://172.16.101.5......
  • windows提权-绕过UAC提权
    windows提权-绕过UAC提权目录windows提权-绕过UAC提权一、UAC概述二、MSF和CS过UAC三、基于白名单AutoElevate绕过UAC四、基于白名单DLL劫持绕过UAC提权五、CVE-2019-1388UAC提权六、Windows令牌概述和令牌窃取攻击一、UAC概述UAC(UserAccountControl),中文翻译为用户帐户控制,......
  • 【Windows】【Chrome】获取 Chrome 离线安装包
    背景有的时候我们需要下载最新版的chrome来试试新特性通用方法https://blog.csdn.net/RadiantJeral/article/details/114436104......
  • EntityFramework Core 6.0 MySql WebApi
    Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.DesignPomelo.EntityFrameworkCore.MySqlMicrosoft.EntityFrameworkCore.Tools-----------------------------------------------------------------------------------------------------------------------......
  • Windows——Windows11右键经典栏与传统栏转换
    图1.Windows11右键默认为经典菜单栏图2.传统右键菜单栏/显示更多选项由经典右键菜单栏变为传统右键菜单栏【图1变图2】运行reg.exeadd"HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32"/f/ve将【显示更多选项】作为默......
  • Windows查看端口情况
    一、查看Windows目前所有使用端口netstat-ano二、查看指定的端口netstat-ano|findstr3389三、使用tasklist命令查看指定PID对应的进程名tasklist|findstr283664  ......
  • windows task
    Win+Randtypingtaskschd.mscschtasks.exe/Create Addanewscheduledtask/tn Nameoftask/sc schedulefrequency(MINUTE,HOURLY,DAILYandsoon)/d Onwhichdayordayofmonththetaskshallbescheduled.Youcanuse*forschedulingoneveryday......
  • 修改Windows远程桌面的端口
    一、图形界面下修改启动注册表编辑器。(在“搜索”框中键入regedit。)导航到以下注册表子项:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TerminalServer\WinStations\RDP-Tcp查找端口号单击“编辑”>“修改”,然后单击“十进制”。键入新端口号,然后单击“确定”......
  • 更改微信PC版(电脑版、windows版)的消息提示音
    目标:声音文件包含在微信PC版安装路径中的「WeChatResource.dll」文件中,修改它。路径举例:C:\ProgramFiles(x86)\Tencent\WeChat\[3.9.2.26] 用到的软件:eXeScope下载地址:https://www.123pan.com/s/kW3DVv-aHxJA.html复制链接(破解版)https://ro.softpedia-sec......