首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 繪圖程式核心技術:滑鼠事件、橡皮擦效果與工具列設計

     編輯:Delphi

繪圖工具切換機制

定義列舉型別 TDrawingTool = (dtLine, dtRectangle, dtEllipse, dtRoundRect, dtPolygon)。工具列按鈕(TSpeedButton)GroupIndex 相同形成單選組,Down 屬性指示當前工具。點擊事件僅設定 DrawingTool 變數。

統一繪圖邏輯 DrawShape

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;

滑鼠三事件協作實現橡皮擦效果

  • OnMouseDown:記錄起點 Origin、MovePt,設 Drawing := True
  • OnMouseMove:若 Drawing 則 pmNotXor 模式畫舊圖(抹除)→ 更新 MovePt → 畫新圖(顯示)
  • OnMouseUp:若 Drawing 則 pmCopy 模式確定繪製 → Drawing := False
procedure 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、目前工具等資訊。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved