How to paint 2 gradients together on a Canvas?

前端 未结 4 928
情深已故
情深已故 2021-02-08 11:16

Please look at this sample gradient image I did with a Paint program:

\"enter

It c

4条回答
  •  南旧
    南旧 (楼主)
    2021-02-08 11:54

    I like to use class helpers on TCanvas so I revised the code in the other answer.

    type
      TTriVertex = record
      public
        type
          P = ^TTriVertex;
      public
        X, Y: DWORD;
        Red, Green, Blue, Alpha: WORD;
        constructor Create(APoint: TPoint; AColor: TColor; AAlpha: Word = 0);
      end;
    
      TTriVertexRect = record
      public
        TopLeft: TTriVertex;
        LowerRight: TTriVertex;
        constructor Create(ARect: TRect; Color1,Color2; AAlpha1: Word = 0; AAlpha2: Word = 0);
      end;
     {Enumerate the constants so they will show up on alt space in the IDE}
     TGradientFillType = (
         gftRectH = GRADIENT_FILL_RECT_H
        ,gftRectV = GRADIENT_FILL_RECT_V
        ,gftTriangle = GRADIENT_FILL_TRIANGLE);
    
     TCavas_Helper = class helper for TCanvas
      public
        function GradientFill(const Vertexes: array of TTriVertexRect; FillType: TGradientFillType): Boolean; overload;
      end;
    
    { TTriVertex }
    
    constructor TTriVertex.Create(APoint: TPoint; AColor: TColor; AAlpha: Word = 0);
    begin
      X := APoint.X;
      Y := APoint.Y;
      Red := GetRValue(ColorToRGB(AColor)) SHL 8;
      Green := GetGValue(ColorToRGB(AColor)) SHL 8;
      Blue := GetBValue(ColorToRGB(AColor)) SHL 8;
      Alpha := 0;
    end;
    
    { TTriVertexRect }
    
    constructor TTriVertexRect.Create(ARect: TRect; Color1, Color2: TColor; AAlpha1,
      AAlpha2: Word);
    begin
      TopLeft.Create(ARect.TopLeft,Color1,AAlpha1);
      LowerRight.Create(ARect.BottomRight,Color2,AAlpha2);
    end;
    
    { TCavas_Helper }
    
    function TCavas_Helper.GradientFill(const Vertexes: array of TTriVertexRect; FillType: TGradientFillType): Boolean;
    var
      GRect: array of TGradientRect;
      Index: Integer;
    begin
      SetLength(GRect,Length(Vertexes));
      for Index := 0 to Length(GRect) do begin
        GRect[Index].UpperLeft := Index*2;
        GRect[Index].LowerRight := Index*2 + 1;
      end;
      Result := WIndows.GradientFill(Handle,@Vertexes[0],Length(Vertexes)*2,@GRect[0],Length(GRect),Ord(FillType))
    end;
    

    So the actual call looks like this

    procedure TForm56.FormPaint(Sender: TObject);
    begin
      Canvas.GradientFill([
          TTriVertexRect.Create(Rect(0,0,ClientWidth,ClientHeight DIV 2),clWhite,$00056AFF)
         ,TTriVertexRect.Create(Rect(0,ClientHeight DIV 2,ClientWidth,ClientHeight),$00056AFF,clWhite)
        ],gftRectV);
    end;
    

    Sample:

    Sample

提交回复
热议问题