定義列舉型別 TDrawingTool = (dtLine, dtRectangle, dtEllipse, dtRoundRect, dtPolygon)。工具列按鈕(TSpeedButton)GroupIndex 相同形成單選組,Down 屬性指示當前工具。點擊事件僅設定 DrawingTool 變數。
procedure TForm1.DrawShape(TopLeft, BottomRight: TPoint; AMode: TPenMode);
begin
with Image.Canvas do
begin
Pen.Mode := AMode;
case DrawingTool of
dtLine: begin MoveTo(TopLeft.X, TopLeft.Y); LineTo(BottomRight.X, BottomRight.Y); end;
dtRectangle: Rectangle(TopLeft.X, TopLeft.Y, BottomRight.X, BottomRight.Y);
dtEllipse: Ellipse(TopLeft.X, TopLeft.Y, BottomRight.X, BottomRight.Y);
dtRoundRect: RoundRect(..., (TopLeft.X-BottomRight.X) div 2, (TopLeft.Y-BottomRight.Y) div 2);
dtPolygon: Polygon([Point(0,0), TopLeft, BottomRight]);
end;
end;
end;
Origin、MovePt,設 Drawing := TrueDrawing 則 pmNotXor 模式畫舊圖(抹除)→ 更新 MovePt → 畫新圖(顯示)Drawing 則 pmCopy 模式確定繪製 → Drawing := Falseprocedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if Drawing then
begin
DrawShape(Origin, MovePt, pmNotXor); // 抹除上一次軌跡
MovePt := Point(X, Y);
DrawShape(Origin, MovePt, pmNotXor); // 繪製新軌跡
end;
end;
pmNotXor 為異或模式,同座標畫兩次即還原背景,達到「橡皮擦」即時預覽效果。
工具列按鈕 OnClick 統一事件,依 Sender 判斷設定 Canvas.Brush.Style(bsSolid/bsClear/bsHorizontal...)與 Canvas.Pen.Style(psSolid/psDash/psDot/psDashDot/psClear)。面板 Visible 綁定主工具按鈕 Down 狀態實現收合展開。
TStatusBar 面板即時顯示 Origin、MovePt、目前工具等資訊。