Direct2D drawing example
提示:这里可以添加技术概要
核心源码
TMyKind = (enCursor, enLine, enEllipse, enRectangle);
TMyState = (Nothing, Drawing, Selecting);
TMyShape = record
Kind: TMyKind;
Box: TD2D1RectF;
Width: Single;
Color: TColor;
end;
var
Form1: TForm1;
MyList: TList;
TempState: TMyState = Nothing;
TempKind: TMyKind = enCursor;
TempBox: TD2D1RectF;
TempShape: TMyShape;
IsMouseDown: Boolean = False;
implementation
{$R *.dfm}
procedure TForm1.AdjustPixels(var ARect: TD2D1RectF; AWidth: Single);
begin
if Odd(Round(AWidth)) then
ARect := D2D1RectF(ARect.Left - 0.5, ARect.Top - 0.5, ARect.Right - 0.5,
ARect.Bottom - 0.5)
end;
procedure TForm1.DrawEllipses(ARect: TD2D1RectF; AWidth: Single;
AColor: TColor);
begin
AdjustPixels(ARect, AWidth);
FBrush.SetColor(D2D1ColorF(AColor));
FCanvas.RenderTarget.DrawEllipse
(D2D1Ellipse(D2D1PointF(ARect.Left + (ARect.Right - ARect.Left) / 2,
ARect.Top + (ARect.Bottom - ARect.Top) / 2), (ARect.Right - ARect.Left) / 2,
(ARect.Bottom - ARect.Top) / 2), FBrush, AWidth);
end;
procedure TForm1.DrawGrid(ASize: TD2DSizeF; AStep: Single);
var
X, Y: Single;
begin
X := 0;
Y := 0;
FBrush.SetColor(D2D1ColorF(clSkyBlue));
while X < ASize.Width do
begin
FCanvas.RenderTarget.DrawLine(D2D1PointF(X + 0.5, 0 + 0.5),
D2D1PointF(X + 0.5, ASize.height + 0.5), FBrush, 1);
X := X + AStep;
end;
while Y < ASize.height do
begin
FCanvas.RenderTarget.DrawLine(D2D1PointF(0 + 0.5, Y + 0.5),
D2D1PointF(ASize.Width + 0.5, Y + 0.5), FBrush, 1);