zoukankan      html  css  js  c++  java
  • 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.
    
  • 相关阅读:
    JavaWeb笔记:连接数据库
    Android笔记:ViewGroup
    Java笔记:异常
    Java笔记:文件夹操作
    Java笔记:有啥记啥
    Java笔记:Number
    Java笔记:修饰符
    数据仓库之启用cdc
    多线程之线程池任务管理通用模板
    关于RESTful 的使用(实战)
  • 原文地址:https://www.cnblogs.com/del/p/1207811.html
Copyright © 2011-2022 走看看