调用CreatePolygonRgn创建HRGN后应如何正确释放对应资源?
问题核心原因
HRGN是Win32 API定义的GDI资源句柄类型,不是Delphi中从TObject派生的类实例,因此本身不存在Free方法,你原来的释放写法是错误的。
正确的资源释放规则
你调用的CreatePolygonRgn属于Win32 GDI API,创建成功会返回有效HRGN句柄,这类资源的释放逻辑遵循Windows API规则:
- 当你调用
SetWindowRgn并传入该HRGN后,如果调用成功,系统会直接接管这个区域资源的所有权,你不需要手动释放该HRGN句柄,也不应该再对这个句柄做任何操作 - 只有当
SetWindowRgn调用失败,或者你创建了HRGN之后没有成功传给SetWindowRgn的场景下,才需要手动调用Win32 APIDeleteObject释放这个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
相关产品推荐
相关产品推荐

