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.
    
  • 相关阅读:
    天天写业务代码,如何成为技术大牛?
    程序员选择公司的8个标准
    大公司里怎样开发和部署前端代码?
    ubuntu安装配置ssh-connect to host localhost port 22: Connection refused
    20-Integer to Roman-Leetcode
    hadoop基础题
    罗马数字表示方式
    19.Happy Number-Leetcode
    修改Ubuntu中locale转中文为英文
    同步、异步、阻塞与非阻塞
  • 原文地址:https://www.cnblogs.com/del/p/1207811.html
Copyright © 2011-2022 走看看