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.