本例效果圖:
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.