• Direct2D (21) : 微软官方关于路径的示例



    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;
    
    type
      TForm1 = class(TForm)
        procedure FormPaint(Sender: TObject);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    uses Direct2D, D2D1;
    
    {左边小山的路径}
    function GetLeftMountainGeometry: ID2D1PathGeometry;
    const
      pts: array[0..5] of TD2DPoint2f = (
        (x:346; y:255),
        (x:267; y:177),
        (x:236; y:192),
        (x:212; y:160),
        (x:156; y:255),
        (x:346; y:255)
      );
    var
      iGeometrySink: ID2D1GeometrySink;
    begin
      D2DFactory.CreatePathGeometry(Result);
      Result.Open(iGeometrySink);
      with iGeometrySink do begin
        SetFillMode(D2D1_FILL_MODE_WINDING);
        BeginFigure(pts[0], D2D1_FIGURE_BEGIN_FILLED);
        AddLines(@pts[1], Length(pts)-1);
        EndFigure(D2D1_FIGURE_END_CLOSED);
        Close;
      end;
    end;
    
    {右边小山的路径}
    function GetRightMountainGeometry: ID2D1PathGeometry;
    const
      pts: array[0..7] of TD2DPoint2f = (
        (x:575; y:263),
        (x:481; y:146),
        (x:449; y:181),
        (x:433; y:159),
        (x:401; y:214),
        (x:381; y:199),
        (x:323; y:263),
        (x:575; y:263)
      );
    var
      iGeometrySink: ID2D1GeometrySink;
    begin
      D2DFactory.CreatePathGeometry(Result);
      Result.Open(iGeometrySink);
      with iGeometrySink do begin
        SetFillMode(D2D1_FILL_MODE_WINDING);
        BeginFigure(pts[0], D2D1_FIGURE_BEGIN_FILLED);
        AddLines(@pts[1], Length(pts)-1);
        EndFigure(D2D1_FIGURE_END_CLOSED);
        Close;
      end;
    end;
    
    {太阳的路径}
    function GetSunGeometry: ID2D1PathGeometry;
    var
      iGeometrySink: ID2D1GeometrySink;
    begin
      D2DFactory.CreatePathGeometry(Result);
      Result.Open(iGeometrySink);
      with iGeometrySink do begin
        SetFillMode(D2D1_FILL_MODE_WINDING);
        {太阳}
        BeginFigure(D2D1PointF(270,255), D2D1_FIGURE_BEGIN_FILLED);
        AddArc(D2D1ArcSegment(
          D2D1PointF(440,255),
          D2D1SizeF(85,85),
          0,
          D2D1_SWEEP_DIRECTION_CLOCKWISE,
          D2D1_ARC_SIZE_SMALL
        ));
        EndFigure(D2D1_FIGURE_END_CLOSED);
        {太阳的光辉}
        BeginFigure(D2D1PointF(299,182), D2D1_FIGURE_BEGIN_HOLLOW);
        AddBezier(D2D1BezierSegment(D2D1PointF(299,182), D2D1PointF(294,176), D2D1PointF(285,178)));
        AddBezier(D2D1BezierSegment(D2D1PointF(276,179), D2D1PointF(272,173), D2D1PointF(272,173)));
        EndFigure(D2D1_FIGURE_END_OPEN);
        //
        BeginFigure(D2D1PointF(354,156), D2D1_FIGURE_BEGIN_HOLLOW);
        AddBezier(D2D1BezierSegment(D2D1PointF(354,156), D2D1PointF(358,149), D2D1PointF(354,142)));
        AddBezier(D2D1BezierSegment(D2D1PointF(349,134), D2D1PointF(354,127), D2D1PointF(354,127)));
        EndFigure(D2D1_FIGURE_END_OPEN);
        //
        BeginFigure(D2D1PointF(322,164), D2D1_FIGURE_BEGIN_HOLLOW);
        AddBezier(D2D1BezierSegment(D2D1PointF(322,164), D2D1PointF(322,156), D2D1PointF(314,152)));
        AddBezier(D2D1BezierSegment(D2D1PointF(306,149), D2D1PointF(305,141), D2D1PointF(305,141)));
        EndFigure(D2D1_FIGURE_END_OPEN);
        //
        BeginFigure(D2D1PointF(385, 164), D2D1_FIGURE_BEGIN_HOLLOW);
        AddBezier(D2D1BezierSegment(D2D1PointF(385,164), D2D1PointF(392,161), D2D1PointF(394,152)));
        AddBezier(D2D1BezierSegment(D2D1PointF(395,144), D2D1PointF(402,141), D2D1PointF(402,142)));
        EndFigure(D2D1_FIGURE_END_OPEN);
        //
        BeginFigure(D2D1PointF(408,182), D2D1_FIGURE_BEGIN_HOLLOW);
        AddBezier(D2D1BezierSegment(D2D1PointF(408,182), D2D1PointF(416,184), D2D1PointF(422,178)));
        AddBezier(D2D1BezierSegment(D2D1PointF(428,171), D2D1PointF(435,173), D2D1PointF(435,173)));
        EndFigure(D2D1_FIGURE_END_OPEN);
        Close;
      end;
    end;
    
    {小河的路径}
    function GetRiverGeometry: ID2D1PathGeometry;
    var
      iGeometrySink: ID2D1GeometrySink;
    begin
      D2DFactory.CreatePathGeometry(Result);
      Result.Open(iGeometrySink);
      with iGeometrySink do begin
        SetFillMode(D2D1_FILL_MODE_WINDING);
        BeginFigure(D2D1PointF(183, 392), D2D1_FIGURE_BEGIN_FILLED);
        AddBezier(D2D1BezierSegment(D2D1PointF(238,284), D2D1PointF(472,345), D2D1PointF(356,303)));
        AddBezier(D2D1BezierSegment(D2D1PointF(237,261), D2D1PointF(333,256), D2D1PointF(333,256)));
        AddBezier(D2D1BezierSegment(D2D1PointF(335,257), D2D1PointF(241,261), D2D1PointF(411,306)));
        AddBezier(D2D1BezierSegment(D2D1PointF(574,350), D2D1PointF(288,324), D2D1PointF(296,392)));
        EndFigure(D2D1_FIGURE_END_OPEN);
        Close;
      end;
    end;
    
    {绘制太阳需要的放射渐变画刷}
    function GetSunRadialGradientBrush(RenderTarget: ID2D1RenderTarget): ID2D1RadialGradientBrush;
    var
      arrGradientStop: array[0..2] of TD2D1GradientStop;
      iGradientStops: ID2D1GradientStopCollection;
    begin
      arrGradientStop[0].position := 0;
      arrGradientStop[0].color := D2D1ColorF(clWebGold);
      arrGradientStop[1].position := 0.85;
      arrGradientStop[1].color := D2D1ColorF(clWebOrange, 0.8);
      arrGradientStop[2].position := 1;
      arrGradientStop[2].color := D2D1ColorF(clWebOrangeRed, 0.7);
    
      RenderTarget.CreateGradientStopCollection(
        @arrGradientStop[0], Length(arrGradientStop),
        D2D1_GAMMA_2_2,
        D2D1_EXTEND_MODE_CLAMP,
        iGradientStops);
    
      RenderTarget.CreateRadialGradientBrush(
        D2D1RadialGradientBrushProperties(D2D1PointF(330,330), D2D1PointF(140,140), 140, 140),
        nil,
        iGradientStops,
        Result
      );
    end;
    
    procedure TForm1.FormPaint(Sender: TObject);
    var
      cvs: TDirect2DCanvas;
      iLeftMountainGeometry,
      iRightMountainGeometry,
      iSunGeometry,
      iRiverGeometry: ID2D1PathGeometry;
    begin
      iLeftMountainGeometry := GetLeftMountainGeometry;
      iRightMountainGeometry := GetRightMountainGeometry;
      iSunGeometry := GetSunGeometry;
      iRiverGeometry := GetRiverGeometry;
    
      cvs := TDirect2DCanvas.Create(Canvas, ClientRect);
      cvs.BeginDraw;
      cvs.RenderTarget.Clear(D2D1ColorF(clWhite));
      {因为太阳被挡在小山后面,先画太阳}
      cvs.DrawGeometry(iSunGeometry);
      cvs.Brush.Handle := GetSunRadialGradientBrush(cvs.RenderTarget);
      cvs.FillGeometry(iSunGeometry);
      {左边小山}
      cvs.DrawGeometry(iLeftMountainGeometry);
      cvs.Brush.Color := clOlive;
      cvs.FillGeometry(iLeftMountainGeometry);
      {右边小山}
      cvs.DrawGeometry(iRightMountainGeometry);
      cvs.Brush.Color := clWebYellowGreen;
      cvs.FillGeometry(iRightMountainGeometry);
      {小河}
      cvs.DrawGeometry(iRiverGeometry);
      cvs.Brush.Color := clWebLightSkyBlue;
      cvs.FillGeometry(iRiverGeometry);
    
      cvs.EndDraw;
      cvs.Free;
    end;
    
    end.
    


    效果图:



  • 相关阅读:
    shell编程
    redis不重启,切换RDB备份到AOF备份
    java中接口和抽象类的区别
    java中的泛型
    java中有关初始化的问题
    java中的多态
    java中的Iterator和ListIterator的区别
    Collection集合的三种初始化方法
    java正则表达式appendReplacement和appendTail方法
    java中main函数的String[] args
  • 原文地址:https://www.cnblogs.com/del/p/2006678.html
Copyright © 2020-2023  润新知