• Direct2D (20) : 图层之 TD2D1LayerParameters.opacityBrush (为图层指定蒙版画刷)



    uses Direct2D, D2D1;
    
    procedure TForm1.FormPaint(Sender: TObject);
    var
      cvs: TDirect2DCanvas;
      iLayer: ID2D1Layer;
      rLayerParameters: TD2D1LayerParameters;
      wic: TWICImage;
      R: TRect;
      iLinearGradientBrush: ID2D1LinearGradientBrush;
      rLinear: TD2D1LinearGradientBrushProperties;
      arrGradientStop: array[0..2] of TD2D1GradientStop;
      iGradientStops: ID2D1GradientStopCollection;
    begin
      wic := TWICImage.Create;
      wic.LoadFromFile('C:\Temp\Test.png');
      R := Rect(0, 0, wic.Width, wic.Height);
      cvs := TDirect2DCanvas.Create(Canvas, ClientRect);
    
      {建立线性渐变画刷}
      rLinear.startPoint := D2D1PointF(0, 0);
      rLinear.endPoint := D2D1PointF(0, wic.Height);
      arrGradientStop[0].position := 0.0;
      arrGradientStop[0].color := D2D1ColorF(clBlack, 1.0);
      arrGradientStop[1].position := 0.6;
      arrGradientStop[1].color := D2D1ColorF(clWhite, 0.0);
      arrGradientStop[2].position := 1.0;
      arrGradientStop[2].color := D2D1ColorF(clBlack, 1.0);
      cvs.RenderTarget.CreateGradientStopCollection(@arrGradientStop[0], Length(arrGradientStop), D2D1_GAMMA_2_2, D2D1_EXTEND_MODE_CLAMP, iGradientStops);
      cvs.RenderTarget.CreateLinearGradientBrush(rLinear, nil, iGradientStops, iLinearGradientBrush);
    
      cvs.RenderTarget.SetTransform(TD2DMatrix3x2F.Translation((ClientWidth-wic.width)/2, (ClientHeight-wic.height)/2));
      cvs.BeginDraw;
      cvs.Brush.Color := clBlack;
      cvs.Rectangle(R);
    
      {在图层中绘制图像}
      cvs.RenderTarget.CreateLayer(nil, iLayer);
      rLayerParameters.contentBounds := R;
      rLayerParameters.geometricMask := nil;
      rLayerParameters.maskAntialiasMode := D2D1_ANTIALIAS_MODE_PER_PRIMITIVE;
      rLayerParameters.maskTransform := TD2DMatrix3x2F.Identity;
      rLayerParameters.opacity := 1.0;
      rLayerParameters.opacityBrush := iLinearGradientBrush; //!
      rLayerParameters.layerOptions := D2D1_LAYER_OPTIONS_NONE;
      cvs.RenderTarget.PushLayer(rLayerParameters, iLayer);
      cvs.StretchDraw(R, wic);
      cvs.RenderTarget.PopLayer;
    
      cvs.EndDraw;
      cvs.Free;
      wic.Free;
    end;
    
    procedure TForm1.FormResize(Sender: TObject);
    begin
      Repaint;
    end;
    


    效果图:



  • 相关阅读:
    C语言清空输入缓冲区的N种方法对比(转)
    UNIX网络编程——socket的keep-alive(转)
    UNIX网络编程——套接字选项(心跳检测、绑定地址复用)(转)
    UNIX网络编程——客户/服务器心搏函数 (转)
    TCP心跳 | TCP keepAlive(转)
    linux下使用adb查看android手机的logcat
    linux 常用查看设备命令(转)
    Spring AOP 详解
    HDU 2222 AC自动机 裸题
    大声说出我爱你—英语发音学习总结
  • 原文地址:https://www.cnblogs.com/del/p/2006154.html
Copyright © 2020-2023  润新知