您的位置:首页 > 编程语言 > Go语言

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

2008-05-26 17:01 288 查看
本例效果图:



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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: