You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用CreatePolygonRgn创建HRGN后应如何正确释放对应资源?

问题核心原因

HRGN是Win32 API定义的GDI资源句柄类型,不是Delphi中从TObject派生的类实例,因此本身不存在Free方法,你原来的释放写法是错误的。

正确的资源释放规则

你调用的CreatePolygonRgn属于Win32 GDI API,创建成功会返回有效HRGN句柄,这类资源的释放逻辑遵循Windows API规则:

  • 当你调用SetWindowRgn并传入该HRGN后,如果调用成功,系统会直接接管这个区域资源的所有权,你不需要手动释放该HRGN句柄,也不应该再对这个句柄做任何操作
  • 只有当SetWindowRgn调用失败,或者你创建了HRGN之后没有成功传给SetWindowRgn的场景下,才需要手动调用Win32 API DeleteObject释放这个HRGN资源

修正后的代码片段

只需要修改你原来的try-finally块部分即可:

// 基于上述坐标点创建多边形区域
VisibleFormRegion := CreatePolygonRgn(VisibleRegionPoints, Length(VisibleRegionPoints), ALTERNATE);
if VisibleFormRegion <> 0 then
begin
  // 调用SetWindowRgn,返回非0表示成功
  if not SetWindowRgn(Self.Handle, VisibleFormRegion, True) then
  begin
    // 调用失败,手动释放HRGN
    DeleteObject(VisibleFormRegion);
  end;
end;

你原来的错误写法所在的finally块可以直接删掉,不需要保留。

额外说明

如果后续你需要修改窗口的区域,直接传入新的HRGN给SetWindowRgn即可,系统会自动释放之前关联的旧区域资源,不需要你手动处理旧的HRGN。


内容的提问来源于stack exchange,提问作者Vlastimil Burián

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 07:48:03