| 常數 | 邏輯 | 典型效果 |
| pmBlack | 0 | 全黑 |
| pmWhite | 1 | 全白 |
| pmNop | D | 不畫 (保持背景) |
| pmNot | NOT D | 背景反色 |
| pmCopy | S | 正常畫筆色 (預設) |
| pmNotCopy | NOT S | 畫筆反色 |
| pmMergePenNot | S OR NOT D | |
| pmMaskPenNot | S AND NOT D | |
| pmMergeNotPen | NOT S OR D | |
| pmMaskNotPen | NOT S AND D | |
| pmMerge | S OR D | 合併 (OR) |
| pmNotMerge | NOT (S OR D) | pmMerge 反色 |
| pmMask | S AND D | 遮罩 (AND) |
| pmNotMask | NOT (S AND D) | pmMask 反色 |
| pmXor | S XOR D | 異或 (可逆、橡皮筋) |
| pmNotXor | NOT (S XOR D) | pmXor 反色 |
混合模式視覺測試代碼
var
i, x, y, w, n: Integer;
begin
// 1. 繪製垂直色帶背景 (18 段調色盤)
x := 0; y := 0;
w := ClientWidth div 18;
for i := 0 to 17 do
begin
Canvas.Brush.Color := PaletteIndex(i);
Canvas.FillRect(Rect(x, y, x + w, ClientHeight));
x := x + w;
end;
// 2. 繪製 16 條紅線,每條用不同 Mode
x := 0; y := 20;
n := ClientWidth;
Canvas.Pen.Width := 4;
Canvas.Pen.Color := clRed;
for i := 0 to 15 do
begin
Canvas.Pen.Mode := TPenMode(i);
Canvas.MoveTo(x, y);
Canvas.LineTo(x + n, y);
y := y + 20;
end;
end;
屬性組合效果速查
| 場景 | Color | Width | Style | Mode |
| 普通實線 | clBlack | 1-5 | psSolid | pmCopy |
| 虛線邊框 | clGray | 1 | psDash | pmCopy |
| 橡皮筋預覽 | clWhite/反色 | 1-2 | psSolid | pmXor |
| 高亮標記 | clYellow | 3 | psSolid | pmMerge |
| 內部邊框 | clBlue | 2 | psInsideFrame | pmCopy |
| 隱藏線條 | 任意 | 任意 | psClear | 任意 |
進階:自定義線型 (psUserStyle)
// 需使用 WinAPI ExtCreatePen (PS_USERSTYLE)
uses Winapi.Windows;
procedure SetCustomPenStyle(ACanvas: TCanvas; const DashPattern: array of DWORD);
var
LB: TLOGBRUSH;
PenHandle: HPEN;
begin
LB.lbStyle := BS_SOLID;
LB.lbColor := ColorToRGB(ACanvas.Pen.Color);
PenHandle := ExtCreatePen(PS_GEOMETRIC or PS_USERSTYLE,
ACanvas.Pen.Width, LB, Length(DashPattern), @DashPattern[0]);
if PenHandle <> 0 then
begin
DeleteObject(ACanvas.Pen.Handle);
ACanvas.Pen.Handle := PenHandle;
end;
end;
// 使用:虛線 10px、間隙 5px、虛線 3px、間隙 5px
SetCustomPenStyle(Canvas, [10, 5, 3, 5]);
常見陷阱
- Width > 1 時虛線/點線失效:GDI 強制實線,需用
ExtCreatePen 實現粗虛線
- pmXor 顏色不可預測:取決於背景像素,深色背景用淺色筆,反之亦然
- 高 DPI 下 Width 需縮放:
Width := MulDiv(LogicWidth, PPI, 96)
- PsInsideFrame 僅對封閉圖形有效:LineTo/MoveTo 畫線時等同 psSolid
熟練掌握 TPen 四大屬性的組合語義,能用最少代碼表達最豐富的線條視覺語言。
- 上一篇文章: Delphi 繪圖進階:TPen 類應用與橡皮筋線(Rubber Band)實現
- 下一篇文章: Delphi TFont 字體屬性完全指南:Name、Size、Color、Style、Charset、Orientation
Copyright ©
程式碼之家 All Rights Reserved