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;
效果图: