Delphi 繪圖三大核心:Canvas (畫布)、Pen (畫筆)、Brush (畫刷)
Delphi 繪圖系統以 TCanvas 為核心,封裝了 Windows GDI。Canvas 提供繪圖表面,Pen 控制線條外觀,Brush 控制填充外觀。理解三者關係與基本操作,是所有繪圖程式的起點。
核心對象關係
- Canvas:繪圖設備上下文封裝,擁有
Pen、Brush、Font 等子屬性
- Pen:線條屬性 —
Color、Width、Style、Mode
- Brush:填充屬性 —
Color、Style、Bitmap
基礎範例 1:繪製直線
procedure TForm1.Button1Click(Sender: TObject);
begin
// 設定畫筆
Canvas.Pen.Color := clRed; // 紅色
Canvas.Pen.Width := 2; // 2 像素寬
// 繪製直線
Canvas.MoveTo(10, 10); // 起點 (移動筆位,不畫線)
Canvas.LineTo(100, 100); // 終點 (從當前位置畫線到此)
// Canvas 是 Self.Canvas 或 Form1.Canvas 簡寫
end;
基礎範例 2:矩形填充
procedure TForm1.Button2Click(Sender: TObject);
begin
// 設定畫刷
Canvas.Brush.Color := clYellow; // 黃色填充
// 填充整個客戶區
Canvas.FillRect(ClientRect); // ClientRect = 窗體客戶區矩形
end;
關鍵函數速查
| 函數 | 用途 | 關鍵屬性 |
| MoveTo(X,Y) | 移動當前筆位 | Pen |
| LineTo(X,Y) | 從當前位置畫線到目標 | Pen |
| FillRect(Rect) | 填充矩形區域 | Brush |
| Rectangle(Rect) | 畫矩形邊框+填充 | Pen + Brush |
| Ellipse(Rect) | 畫橢圓/圓 | Pen + Brush |
| TextOut(X,Y,Text) | 輸出文字 | Font + Brush (背景) |
Pen 常用屬性
Color: TColor — 線條顏色 (clRed, clBlue, $00FF0000 等)
Width: Integer — 線寬 (像素,預設 1,≤0 視為 1)
Style: TPenStyle — psSolid/psDash/psDot/psDashDot/psClear/psInsideFrame
Mode: TPenMode — pmCopy(預設)/pmXor/pmNot/pmMask 等 16 種混合模式
Brush 常用屬性
Color: TColor — 填充顏色 (Style=bsSolid 時)
Style: TBrushStyle — bsSolid/bsClear/bsHorizontal/bsVertical/bsFDiagonal/bsBDiagonal/bsCross/bsDiagCross
Bitmap: TBitmap — 紋理填充 (Style 自動變為 bsPattern)
座標系統說明
- 原點 (0,0):視窗客戶區左上角
- X 軸:向右遞增
- Y 軸:向下遞增 (與數學慣例相反)
- 單位:邏輯像素 (高 DPI 下需縮放)
常見新手錯誤與避坑
- 忘記設定 Pen/Brush:使用預設值 (黑筆、白刷) 導致效果不符預期
- MoveTo/LineTo 混淆:LineTo 從當前位置畫線,非從上次 LineTo 終點
- FillRect vs Rectangle:前者僅填充,後者邊框+填充
- 在 OnPaint 外繪圖:視窗重繪時會丟失,應在
OnPaint 或 PaintBox.OnPaint 中繪製
- 不釋放 GetDC 獲取的 DC:導致資源洩漏
進階:雙緩衝防閃爍 (核心技巧)
procedure TForm1.FormPaint(Sender: TObject);
var
Bmp: TBitmap;
begin
Bmp := TBitmap.Create;
try
Bmp.Width := ClientWidth;
Bmp.Height := ClientHeight;
// 1. 所有繪圖在記憶體位圖上
Bmp.Canvas.Brush.Color := clWhite;
Bmp.Canvas.FillRect(Bmp.Canvas.ClipRect);
Bmp.Canvas.Pen.Color := clRed;
Bmp.Canvas.MoveTo(10,10);
Bmp.Canvas.LineTo(100,100);
// 2. 一次性複製到螢幕
Canvas.Draw(0, 0, Bmp);
finally
Bmp.Free;
end;
end;
掌握 Canvas/Pen/Brush 三位一體的操作模式,配合 MoveTo/LineTo、FillRect/Rectangle 基礎圖元,即可開始構建任意複雜的 2D 繪圖應用。
- 上一篇文章: Delphi 矩形類圖形繪製:Rectangle、RoundRect、DrawFocusRect、FrameRect 完整指南
- 下一篇文章: Delphi TCanvas 類成員完整清單:方法、函數、屬性、事件
Copyright ©
程式碼之家 All Rights Reserved