WinAPI: CreatePolyPolygonRgn - 建立多个多边形构成的区域

本例效果图:

WinAPI: CreatePolyPolygonRgn - 建立多个多边形构成的区域

unit Unit1;



interface



uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs;



type

  TForm1 = class(TForm)

    procedure FormClick(Sender: TObject);

  end;



var

  Form1: TForm1;



implementation



{$R *.dfm}



var f: Boolean = False;



procedure TForm1.FormClick(Sender: TObject);

const

  n = 50;

var

  ps: array[0..6] of TPoint;

  ns: array[0..1] of Integer;

  Rgn: HRGN;

  i: Integer;

begin

  Refresh;

  ps[0] := Point(n, n div 2);

  ps[1] := Point(n, ClientHeight - n);

  ps[2] := Point(ClientWidth - n, ClientHeight - n);

  ps[3] := Point(ClientWidth - n, n div 2);



  ps[4] := Point(ClientWidth div 2, n);

  ps[5] := Point(n div 2, ClientHeight - n div 2);

  ps[6] := Point(ClientWidth - n div 2, ClientHeight - n div 2);



  ns[0] := 4;

  ns[1] := 3;



  {建立多个多边形构成的区域}

  if f then

  begin

    Rgn := CreatePolyPolygonRgn(ps, ns, Length(ns), WINDING);

    Text := '填充模式: WINDING';

  end else begin

    Rgn := CreatePolyPolygonRgn(ps, ns, Length(ns), ALTERNATE);

    Text := '填充模式: ALTERNATE';

  end;

  f := not f;



  {填充区域}

  Canvas.Brush.Color := clSilver;

  Canvas.Brush.Style := bsCross;

  FillRgn(Canvas.Handle, Rgn, Canvas.Brush.Handle);



  {绘制区域边界}

  Canvas.Brush.Color := clRed;

  Canvas.Brush.Style := bsSolid;

  FrameRgn(Canvas.Handle, Rgn, Canvas.Brush.Handle, 2, 2);



  Canvas.Brush.Color := Self.Color;

  for i := 0 to Length(ps) do

    Canvas.TextOut(ps[i].X, ps[i].Y, IntToStr(i));



  DeleteObject(Rgn);

end;



end.


 
   

下面的 "老A123" 需要使用动态数组, 可以改成这样:

unit Unit1;



interface



uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs;



type

  TForm1 = class(TForm)

    procedure FormClick(Sender: TObject);

  end;



var

  Form1: TForm1;



implementation



{$R *.dfm}



var f: Boolean = False;



procedure TForm1.FormClick(Sender: TObject);

const

  n = 50;

var

  ps: array of TPoint;

  ns: array of Integer;

  Rgn: HRGN;

  i: Integer;

begin

  SetLength(ps, 7);

  SetLength(ns, 2);

  Refresh;

  ps[0] := Point(n, n div 2);

  ps[1] := Point(n, ClientHeight - n);

  ps[2] := Point(ClientWidth - n, ClientHeight - n);

  ps[3] := Point(ClientWidth - n, n div 2);



  ps[4] := Point(ClientWidth div 2, n);

  ps[5] := Point(n div 2, ClientHeight - n div 2);

  ps[6] := Point(ClientWidth - n div 2, ClientHeight - n div 2);



  ns[0] := 4;

  ns[1] := 3;



  {建立多个多边形构成的区域}

  if f then

  begin

    Rgn := CreatePolyPolygonRgn(ps[0], ns[0], Length(ns), WINDING);

    Text := '填充模式: WINDING';

  end else begin

    Rgn := CreatePolyPolygonRgn(ps[0], ns[0], Length(ns), ALTERNATE);

    Text := '填充模式: ALTERNATE';

  end;

  f := not f;



  {填充区域}

  Canvas.Brush.Color := clSilver;

  Canvas.Brush.Style := bsCross;

  FillRgn(Canvas.Handle, Rgn, Canvas.Brush.Handle);



  {绘制区域边界}

  Canvas.Brush.Color := clRed;

  Canvas.Brush.Style := bsSolid;

  FrameRgn(Canvas.Handle, Rgn, Canvas.Brush.Handle, 2, 2);



  Canvas.Brush.Color := Self.Color;

  for i := 0 to Length(ps) do

    Canvas.TextOut(ps[i].X, ps[i].Y, IntToStr(i));



  DeleteObject(Rgn);

end;



end.


 
   

你可能感兴趣的:(create)