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.
    
  • 相关阅读:
    java中判断字符是否为英文字母、中文汉字或者数字
    JavaScript:多种定义数组的方式
    java位移运算符<<、>>、>>>
    安卓进阶:元注解Support Annotation Library使用详解
    正则:匹配引号内的字符串内容
    安卓:自定义字体
    安卓:Activity的自定义主题
    Pyhton学习——Day38
    测试用html
    Pyhton学习——Day37
  • 原文地址:https://www.cnblogs.com/del/p/1207811.html
Copyright © 2011-2022 走看看