• 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.
    
  • 相关阅读:
    2019省赛训练组队赛4.9周二 2017浙江省赛
    #Leetcode# 49. Group Anagrams
    #Leetcode# 57. Insert Interval
    POJ 2195 Going Home
    HDU 2255 奔小康赚大钱
    HDU 1083 Courses
    HDU 2063 过山车
    POJ 3041 Asteroids
    指针的妙处
    jzoj 6273. 2019.8.4【NOIP提高组A】欠钱 (money)
  • 原文地址:https://www.cnblogs.com/del/p/1203446.html
Copyright © 2020-2023  润新知