本例效果图:
下面的 "老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[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.