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;


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

WinAPI: GetRegionData

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.


 
   

你可能感兴趣的:(Data)