随笔 - 2146  文章 - 97 评论 - 11767 trackbacks - 253

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.

posted on 2008-05-20 16:18  万一  阅读(...)  评论(...编辑  收藏