WinAPI: GetRegionData

GetRegionData(
RGN: HRGN; {区域句柄}
p2: DWORD; {区域数据缓冲区大小}
p3: PRgnData {区域数据结构 TRgnData 的指针, 见下表}
): DWORD; {成功返回 1}

//TRgnData 是 _RGNDATA 结构的重命名:

_RGNDATA = record
rdh: TRgnDataHeader; {数据头; 又是个结构, 见下表}
Buffer: array[0..0] of CHAR; {}
Reserved: array[0..2] of CHAR; {}
end;

//TRgnDataHeader 是 _RGNDATAHEADER 结构的重命名:

_RGNDATAHEADER = packed record
dwSize: DWORD; {}
iType: DWORD; {}
nCount: DWORD; {}
nRgnSize: DWORD; {}
rcBound: TRect; {}
end;


每个区域都是有若干矩形构成的, 下面的例子枚举了一个区域中的所有矩形. 运行效果图:


unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
Rgn: HRGN; {区域句柄}
RgnDataSize: Integer; {区域数据缓冲区的大小}
RgnData: PRgnData; {区域数据指针}
BrushHandle: HBRUSH; {笔刷句柄}
Count: Integer; {区域中的矩形总数}
Rect: PRect; {矩形指针}
i: Integer;
begin
{建立一个圆角矩形区域}
Rgn := CreateRoundRectRgn(10,10,180,190,120,130);

{建立笔刷, 并填充区域}
BrushHandle := CreateSolidBrush(clSkyBlue);
FillRgn(Canvas.Handle, Rgn, BrushHandle);

{获取区域数据缓冲区的大小, 并申请需要的内存}
RgnDataSize := GetRegionData(Rgn, 0, nil);
GetMem(RgnData, RgnDataSize);

{再次使用 GetRegionData, 获取区域数据}
GetRegionData(Rgn, RgnDataSize, RgnData);

{获取矩形总数}
Count := RgnData^.rdh.nCount;
Text := '区域中的矩形总数: ' + IntToStr(Count);

{获取第一个矩形的指针}
Rect := @RgnData^.Buffer;

{枚举区域中的矩形, 并使用随机颜色画出来}
Randomize;
for i := 0 to Count - 1 do
begin
Canvas.Brush.Color := Random($FFFFFF);
Canvas.FillRect(Rect^);
Inc(Rect); {指向下一个矩形}
end;

{释放资源}
DeleteObject(BrushHandle);
DeleteObject(Rgn);
FreeMem(RgnData);
end;

end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值