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

GDI+ 區域轉 GDI 句柄:GetHRGN 互操作實作 FrameRgn 繪製邊框

     編輯:Delphi

互操作需求

GDI+ 區域 (TGPRegion) 功能強大,但有時需配合傳統 GDI 函數 (如 FrameRgn、FillRgn、InvertRgn) 使用。TGPRegion.GetHRGN(Graphics) 可將 GDI+ 區域轉換為 GDI 區域句柄 (HRGN),實現無縫互操作。

核心流程

  1. 建立 TGPRegion (此例為矩形區域)。
  2. 使用 TGPGraphics.FillRegion 填充圖案刷。
  3. 呼叫 rgn.GetHRGN(g) 取得 HRGN (需傳入 Graphics 以獲取裝置上下文)。
  4. 使用 GDI FrameRgn(Canvas.Handle, HRGN, Brush.Handle, 2, 2) 繪製紅色邊框。
  5. 必須 DeleteObject(HRGN) 釋放 GDI 物件,避免洩漏。

完整代碼

procedure TForm1.FormPaint(Sender: TObject);
var g: TGPGraphics; b: TGPBrush; rgn: TGPRegion; RegionHandle: HRGN;
begin
  g := TGPGraphics.Create(Canvas.Handle);
  b := TGPHatchBrush.Create(HatchStyleDiagonalCross, aclSilver, aclLemonChiffon);
  rgn := TGPRegion.Create(MakeRect(40, 40, ClientWidth-80, ClientHeight-80));
  try
    g.FillRegion(b, rgn);
    RegionHandle := rgn.GetHRGN(g);
    Canvas.Brush.Color := clRed;
    FrameRgn(Canvas.Handle, RegionHandle, Canvas.Brush.Handle, 2, 2);
    DeleteObject(RegionHandle); // 關鍵:釋放 GDI 區域句柄
  finally
    rgn.Free; b.Free; g.Free;
  end;
end;

執行效果

斜十字影線填充區域,外加紅色 2px 邊框 (GDI FrameRgn 繪製):

GetHRGN FrameRgn 效果

注意事項

  • GetHRGN 建立的 HRGN 屬於 GDI 物件,**必須手動 DeleteObject**,GDI+ 不會自動管理。
  • 傳入的 TGPGraphics 必須有效 (已建立、未釋放),用於獲取 HDC 進行座標轉換。
  • 轉換後的 HRGN 為裝置座標,受 Graphics 當前變換矩陣影響。

應用場景

  • 舊專案逐步遷移:GDI+ 繪圖核心 + GDI 區域操作 (命中測試、剪裁)
  • 列印預覽:GDI+ 高品質繪圖 + GDI 頁面區域管理
  • 剪貼板區域資料交換 (CF_REGION 格式)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved