Direct2D (37) : 使用不同画刷绘制文本


uses Direct2D, D2D1;

{建立位图画刷的函数}
function GetBitmapBrush(Canvas: TDirect2DCanvas; filePath: string): ID2D1BitmapBrush;
var
  rBBP: TD2D1BitmapBrushProperties;
  bit: TBitmap;
begin
  bit := TBitmap.Create;
  bit.LoadFromFile(filePath);
  rBBP.extendModeX := D2D1_EXTEND_MODE_WRAP;
  rBBP.extendModeY := D2D1_EXTEND_MODE_WRAP;
  rBBP.interpolationMode := D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR;
  Canvas.RenderTarget.CreateBitmapBrush(Canvas.CreateBitmap(bit), @rBBP, nil, Result);
  bit.Free;
end;

{建立线性渐变画刷的函数}
function GetLinearGradientBrush(RenderTarget: ID2D1RenderTarget; Colors: array of TColor): ID2D1LinearGradientBrush;
var
  rLinear: TD2D1LinearGradientBrushProperties;
  rGradientStops: array of TD2D1GradientStop;
  iGradientStops: ID2D1GradientStopCollection;
  rSizeF: TD2DSizeF;
  count,i: Integer;
begin
  RenderTarget.GetSize(rSizeF);
  rLinear.startPoint := D2D1PointF(0, rSizeF.height/2);
  rLinear.endPoint := D2D1PointF(rSizeF.width, rSizeF.height/2);
  count := Length(Colors);
  SetLength(rGradientStops, count);
  for i := 0 to count - 1 do
  begin
    rGradientStops[i].position := i * (1 / (count-1));
    rGradientStops[i].color := D2D1ColorF(Colors[i]);
  end;
  RenderTarget.CreateGradientStopCollection(
    @rGradientStops[0], count, D2D1_GAMMA_2_2, D2D1_EXTEND_MODE_CLAMP, iGradientStops
  );
  RenderTarget.CreateLinearGradientBrush(rLinear, nil, iGradientStops, Result);
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  cvs: TDirect2DCanvas;
  str: string;
  iTextFormat: IDWriteTextFormat;
  iBrush: ID2D1Brush;
begin
  str := 'Hello World using DirectWrite!';
  DWriteFactory.CreateTextFormat(
    'Gabriola',
    nil,
    DWRITE_FONT_WEIGHT_ULTRA_BLACK,
    DWRITE_FONT_STYLE_NORMAL,
    DWRITE_FONT_STRETCH_NORMAL,
    72.0,
    'en-us',
    iTextFormat
  );
  iTextFormat.SetTextAlignment(DWRITE_TEXT_ALIGNMENT_CENTER);
  iTextFormat.SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_CENTER);

  cvs := TDirect2DCanvas.Create(Canvas, ClientRect);
  cvs.RenderTarget.BeginDraw;
  cvs.RenderTarget.Clear(D2D1ColorF(clWhite));

  if Tag = 0 then
    iBrush := GetLinearGradientBrush(cvs.RenderTarget, [clRed, clYellow])
  else
    iBrush := GetBitmapBrush(cvs, 'C:\Temp\Test.bmp'); //!

  cvs.RenderTarget.DrawText(PWideChar(str), Length(str), iTextFormat, ClientRect, iBrush);
  cvs.RenderTarget.EndDraw();
  cvs.Free;
end;

{鼠标单击转换画刷}
procedure TForm1.FormClick(Sender: TObject);
begin
  Tag := not Tag;
  Repaint;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  Repaint;
end;


效果图:

o_201104131.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值