| 常數 | 視覺效果 | 說明 |
| bsSolid | 實心填充 | 使用 Color 屬性顏色 |
| bsClear | 透明/無填充 | 僅繪製邊框 (配合 Pen) |
| bsHorizontal | 水平線 | 間距固定 |
| bsVertical | 垂直線 | 間距固定 |
| bsFDiagonal | 正斜線 (↗) | 左下到右上 |
| bsBDiagonal | 反斜線 (↘) | 左上到右下 |
| bsCross | 十字網格 | 水平+垂直線 |
| bsDiagCross | 對角網格 | 正斜+反斜線 |
畫刷樣式展示代碼
var
i, n: Integer;
r: TRect;
begin
Canvas.Pen.Color := clRed;
Canvas.Pen.Width := 1;
n := 10;
for i := 0 to 7 do
begin
Canvas.Brush.Color := clYellow;
Canvas.Brush.Style := TBrushStyle(i); // 依次套用 8 種樣式
r := Rect(n, 10, n + 36, ClientHeight - 10);
Canvas.FillRect(r); // 填充內部
Canvas.Rectangle(r); // 畫邊框對比
n := n + 48;
end;
end;
Bitmap 紋理填充:以圖片為填充單元
procedure TForm1.FormClick(Sender: TObject);
var
Bmp: TBitmap;
begin
Bmp := TBitmap.Create;
try
Bmp.LoadFromFile('C:\temp\bg.bmp'); // 載入紋理圖
Canvas.Brush.Bitmap := Bmp; // 指定為畫刷紋理
Canvas.Ellipse(0, 0, ClientWidth, ClientHeight); // 繪製填充橢圓
finally
Bmp.Free; // 注意:Brush.Bitmap 不擁有 Bitmap,手動釋放
end;
end;
關鍵屬性行為詳解
| 屬性 | 類型 | 行為細節 |
| Color | TColor | 僅在 Style=bsSolid 時生效;其他樣式下 Color 決定圖案線條顏色 |
| Style | TBrushStyle | bsClear 時不填充內部,配合 Pen 畫空心圖形 |
| Bitmap | TBitmap | 設定後 Style 自動視為 bsPattern (內部值);Bitmap 尺寸決定紋理重複頻率 |
| Handle | HBRUSH | 底層 GDI 畫刷句柄,進階互操作用 |
進階技巧:自定義畫刷圖案
// 建立 8x8 自定義圖案畫刷 (需 WinAPI)
function CreatePatternBrush8x8(const Pattern: array of Byte): HBRUSH;
var
Bmp: TBitmap;
i, j: Integer;
begin
Bmp := TBitmap.Create;
try
Bmp.Width := 8;
Bmp.Height := 8;
Bmp.PixelFormat := pf1bit; // 單色位圖
for j := 0 to 7 do
for i := 0 to 7 do
if (Pattern[j] shr (7-i)) and 1 = 1 then
Bmp.Canvas.Pixels[i, j] := clBlack
else
Bmp.Canvas.Pixels[i, j] := clWhite;
Result := CreatePatternBrush(Bmp.Handle);
finally
Bmp.Free;
end;
end;
// 使用
Canvas.Brush.Handle := CreatePatternBrush8x8([$AA, $55, $AA, $55, $AA, $55, $AA, $55]); // 棋盤格
Canvas.FillRect(Rect(0,0,100,100));
DeleteObject(Canvas.Brush.Handle); // 手動釋放 GDI 物件
常見陷阱與避坑
- Brush.Bitmap 不擁有所有權:設定後必須自行管理 Bitmap 生命週期,過早 Free 導致繪圖錯誤
- Style 切換會重置 Bitmap:設定 Style := bsSolid 會清除 Bitmap 關聯
- bsClear + Pen.Width > 1:邊框會向內外擴展,填充區域為空
- 高 DPI 下 Bitmap 紋理模糊:需準備多倍圖或用 Metafile 向量紋理
效能提示
- 純色填充 (bsSolid) 最快,GDI 內部優化
- 斜線/網格樣式次之,系統預建畫刷
- Bitmap 紋理較慢,大面積填充考慮
StretchDraw 替代
- 頻繁切換 Brush 屬性時,考慮快取多個
TBrush 實例
靈活運用 TBrush 三大填充模式,配合 TPen 邊框控制,能構建出專業級的圖形視覺效果。
- 上一篇文章: Delphi 圖像類體系詳解:TGraphic、TBitmap、TMetafile、TIcon、TPicture
- 下一篇文章: Delphi 繪圖進階:TPen 類應用與橡皮筋線(Rubber Band)實現
Copyright ©
程式碼之家 All Rights Reserved