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.