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