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

Delphi TPen 畫筆屬性全解析:Color、Width、Style、Mode 完整指南

     編輯:Delphi

TPen 四大核心屬性深度解析與視覺效果對照

TPen 控制線條、邊框、曲線的繪製外觀。掌握 Color、Width、Style (線型)、Mode (混合模式) 四大屬性的組合效果,是 Delphi 繪圖程式設計的基本功。

Style:9 種線型樣式

線型展示代碼


var
  i, x, y, n: Integer;
begin
  x := 10; y := 15;
  n := ClientWidth - 2 * x;
  Canvas.Pen.Color := clRed;
  for i := 0 to 8 do
  begin
    Canvas.Pen.Style := TPenStyle(i);
    Canvas.MoveTo(x, y);
    Canvas.LineTo(x + n, y);
    y := y + 15;
  end;
end;

Width:線寬行為細節

  • 預設值:1
  • ≤ 0 時:自動使用預設值 1
  • Style 非 psSolid/psInsideFrame 時:強制 Width = 1 (GDI 限制)
  • psInsideFrame:寬度向圖形內部擴展,不超出邊界

Mode:16 種混合模式 (ROP2 光柵運算)

常數值視覺效果Width 限制
psSolid0實線任意
psDash1虛線 (─ ─ ─)≤ 1
psDot2點線 (· · ·)≤ 1
psDashDot3虛點線 (─ · ─ ·)≤ 1
psDashDotDot4虛雙點線 (─ · · ─ · ·)≤ 1
psClear5不可見 (不畫)任意
psInsideFrame6實線,寬度向內擴展任意
psUserStyle7用戶自定義 (需 WinAPI).NET 支援
psAlternate8交替 (保留).NET 支援

混合模式視覺測試代碼


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;

屬性組合效果速查

常數邏輯典型效果
pmBlack0全黑
pmWhite1全白
pmNopD不畫 (保持背景)
pmNotNOT D背景反色
pmCopyS正常畫筆色 (預設)
pmNotCopyNOT S畫筆反色
pmMergePenNotS OR NOT D
pmMaskPenNotS AND NOT D
pmMergeNotPenNOT S OR D
pmMaskNotPenNOT S AND D
pmMergeS OR D合併 (OR)
pmNotMergeNOT (S OR D)pmMerge 反色
pmMaskS AND D遮罩 (AND)
pmNotMaskNOT (S AND D)pmMask 反色
pmXorS XOR D異或 (可逆、橡皮筋)
pmNotXorNOT (S XOR D)pmXor 反色

進階:自定義線型 (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]);

常見陷阱

  1. Width > 1 時虛線/點線失效:GDI 強制實線,需用 ExtCreatePen 實現粗虛線
  2. pmXor 顏色不可預測:取決於背景像素,深色背景用淺色筆,反之亦然
  3. 高 DPI 下 Width 需縮放:Width := MulDiv(LogicWidth, PPI, 96)
  4. PsInsideFrame 僅對封閉圖形有效:LineTo/MoveTo 畫線時等同 psSolid

熟練掌握 TPen 四大屬性的組合語義,能用最少代碼表達最豐富的線條視覺語言。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景ColorWidthStyleMode
普通實線clBlack1-5psSolidpmCopy
虛線邊框clGray1psDashpmCopy
橡皮筋預覽clWhite/反色1-2psSolidpmXor
高亮標記clYellow3psSolidpmMerge
內部邊框clBlue2psInsideFramepmCopy
隱藏線條任意任意psClear任意