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

再學GDI+[47]: 路徑閉合與填充 - CloseFigure 方法控制開放/閉合路徑填充行為

     編輯:Delphi

前言

CloseFigure 是控制路徑開放與閉合的關鍵方法。開放路徑僅能描邊,閉合路徑才能填充。本文以簡單三角形折線為例,示範 CloseFigure 對描邊與填充的雙重影響。

CloseFigure 核心行為

  • 在當前點與子圖形起始點之間添加直線段
  • <在 PathTypes 中將當前點標記加上 $80 (CloseSubpath)
  • 使路徑成為「閉合區域」,啟用 FillPath 填充功能
  • 不影響已閉合的子圖形

雙 CheckBox 控制範例

  • CheckBox1:啟用 CloseFigure(三角形閉合)
  • CheckBox2:啟用 FillPath(填充內部)
  • 四種組合完整展示:開放描邊、閉合描邊、開放填充(無效)、閉合填充

核心實作

procedure TForm1.FormPaint(Sender: TObject);
var
  g: TGPGraphics;
  path: TGPGraphicsPath;
  p: TGPPen;
  b: TGPBrush;
  pt1, pt2, pt3: TGPPoint;
begin
  pt1 := MakePoint(0, ClientHeight div 2);
  pt2 := MakePoint(ClientWidth div 2, 0);
  pt3 := MakePoint(ClientWidth, ClientHeight div 2);
  
  g := TGPGraphics.Create(Canvas.Handle);
  path := TGPGraphicsPath.Create;
  path.AddLine(pt1, pt2);
  path.AddLine(pt2, pt3);  {缺少 pt3→pt1 的閉合線}
  
  if CheckBox1.Checked then path.CloseFigure;  {補上閉合線}
  
  p := TGPPen.Create(aclRed, 2);
  b := TGPSolidBrush.Create(aclYellow);
  
  if CheckBox2.Checked then g.FillPath(b, path);  {僅閉合時有效}
  g.DrawPath(p, path);  {描邊總是有效}
  
  b.Free; p.Free; path.Free; g.Free;
end;

執行效果預覽

CloseFigure 填充效果

四種組合結果分析

CloseFigureFillPath描邊結果填充結果說明
否否V 形開放折線無基礎開放路徑
是否三角形閉合邊框無閉合但未填充
否是V 形開放折線無/錯誤開放路徑無法填充
是是三角形閉合邊框黃色實心三角形正確閉合填充

常見錯誤與最佳實踐

  • 錯誤:嘗試填充未閉合路徑 → 無視覺輸出或渲染異常
  • 最佳:幾何圖形構建完畢後統一呼叫 CloseFigure 或 CloseAllFigures
  • 技巧:AddRectangle、AddEllipse 等內建方法自動閉合,無需手動呼叫
  • 文字路徑:AddString 產生的字形路徑已正確閉合所有輪廓

表單定義檔

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 179
  ClientWidth = 243
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  OnCreate = FormCreate
  OnPaint = FormPaint
  PixelsPerInch = 96
  TextHeight = 13
  object CheckBox1: TCheckBox ... {閉合路徑 / 填充路徑}
end
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved