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