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

再學GDI+[72]: 區域建立完全指南 - 矩形、路徑與 GDI 句柄三大來源

     編輯:Delphi

前言

TGPRegion 是 GDI+ 中處理不規則圖形剪裁、點擊測試與布林運算的核心類別。本文詳細介紹建立區域的五種方式,並著重示範前三種最常用的方法:矩形建立、路徑建立、GDI 區域句柄建立。

五種建立區域的方法總覽

  1. 根據矩形建立(矩形區域) - TGPRegion.Create(rt: TGPRect)
  2. 根據路徑建立 - TGPRegion.Create(path: TGPGraphicsPath)
  3. 根據 GDI 區域句柄建立 - TGPRegion.Create(HRGN)
  4. 根據區域資料建立 - 從 GetData 取得的二進位資料重建
  5. 無參數建立 - 建立空區域,再透過運算方法填充

範例程式架構

程式使用 TRadioGroup 切換三種建立模式,即時在視窗上繪製對應區域:

  • 模式 0:矩形區域
  • 模式 1:橢圓路徑區域
  • 模式 2:多邊形 GDI 區域句柄轉換

核心程式碼

procedure TForm1.FormPaint(Sender: TObject);
var
  rt: TGPRect;
  pts: array[0..2] of TPoint;
  RgnHandle: HRGN;
  g: TGPGraphics;
  path: TGPGraphicsPath;
  b: TGPBrush;
  rgn: TGPRegion;
begin
  rt := MakeRect(20, 20, 100, ClientHeight-40);
  pts[0] := Point(rt.X + rt.Width div 2, rt.Y);
  pts[1] := Point(rt.X, rt.Y + rt.Height);
  pts[2] := Point(rt.X + rt.Width, rt.Y + rt.Height);
  
  case RadioGroup1.ItemIndex of
    0: rgn := TGPRegion.Create(rt);  {矩形區域}
    1: begin                          {路徑區域}
         path := TGPGraphicsPath.Create;
         path.AddEllipse(rt);
         rgn := TGPRegion.Create(path);
         path.Free;
       end;
    2: begin                          {GDI 句柄區域}
         RgnHandle := CreatePolygonRgn(pts, Length(pts), WINDING);
         rgn := TGPRegion.Create(RgnHandle);
         DeleteObject(RgnHandle);     {釋放 GDI 句柄}
       end;
  end;
  
  g := TGPGraphics.Create(Canvas.Handle);
  b := TGPHatchBrush.Create(HatchStyleDiagonalCross, aclSilver, aclGray);
  g.FillRegion(b, rgn);
  
  b.Free; rgn.Free; g.Free;
end;

執行效果預覽

區域建立效果圖

關鍵技術點解析

1. 矩形區域 - 最簡單直接

適用於矩形剪裁區域、簡單碰撞偵測。座標系統為單位像素。

2. 路徑區域 - 形狀最靈活

透過 TGPGraphicsPath 可建立任意複雜形狀(曲線、文字、多邊形組合),再轉為區域進行運算。

3. GDI 句柄互通 - 舊代碼整合關鍵

  • 使用 Windows API CreatePolygonRgn、CreateRectRgn 等建立 HRGN
  • TGPRegion.Create(HRGN) 實現無縫轉換
  • 務必呼叫 DeleteObject(RgnHandle) 釋放 GDI 資源

表單定義檔

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 137
  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 = 121
    Caption = 'RadioGroup1'
    TabOrder = 0
    OnClick = RadioGroup1Click
  end
end
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved