在 GDI+ 中,TGPRegion 類別提供了強大的區域運算功能,允許開發者對圖形區域進行布林運算。本文將詳細介紹五種核心運算模式:交集、聯集、排他或、排除 以及 補集,並透過完整的 Delphi 範例程式碼示範如何在實際專案中應用這些操作。
| 方法 | 英文名稱 | 中文說明 | 運算邏輯 |
|---|---|---|---|
Intersect | Intersection | 交集 | 保留兩個區域重疊的部分 |
Union | Union | 聯集 | 合併兩個區域,包含所有範圍 |
Xor_ | Exclusive Or | 排他或 | 保留不重疊的部分(移除交集) |
Exclude | Exclude | 排除 | 從第一個區域中移除第二個區域 |
Complement | Complement | 補集 | 取第一個區域中不與第二個區域重疊的部分 |
範例程式建立一個橢圓路徑並轉換為區域,再建立一個矩形區域,透過 TRadioGroup 讓使用者即時切換運算模式觀察結果。
procedure TForm1.FormPaint(Sender: TObject);
var
g: TGPGraphics;
p: TGPPen;
path: TGPGraphicsPath;
b: TGPBrush;
rgn: TGPRegion;
rt: TGPRect;
begin
g := TGPGraphics.Create(Canvas.Handle);
p := TGPPen.Create(MakeColor(100, 255, 0, 0));
b := TGPHatchBrush.Create(HatchStyleSmallGrid, aclSilver, aclCornflowerBlue);
{建立橢圓路徑並轉為區域}
path := TGPGraphicsPath.Create;
path.AddEllipse(20, 20, 100, 80);
rgn := TGPRegion.Create(path);
{取得路徑外接矩形並下移}
path.GetBounds(rt);
rt.Y := rt.Y + rt.Height div 2;
{根據選項執行區域運算}
case RadioGroup1.ItemIndex of
1: rgn := TGPRegion.Create(rt); {單純顯示矩形}
2: rgn.Intersect(rt); {交集}
3: rgn.Union(rt); {聯集}
4: rgn.Xor_(rt); {排他或}
5: rgn.Exclude(rt); {排除}
6: rgn.Complement(rt); {補集}
end;
g.FillRegion(b, rgn); {填充運算後的區域}
g.DrawPath(p, path); {繪製原始橢圓路徑}
g.DrawRectangle(p, rt); {繪製參考矩形}
{釋放資源}
b.Free; rgn.Free; p.Free; g.Free; path.Free;
end;

Intersect、Union 等方法會直接修改呼叫物件本身,若需保留原始區域請先複製。Create/Free 配對原則,避免 GDI+ 物件洩漏。object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 167
ClientWidth = 238
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 RadioGroup1: TRadioGroup
Left = 137
Top = 8
Width = 91
Height = 151
Caption = 'RadioGroup1'
TabOrder = 0
OnClick = RadioGroup1Click
end
end