【发布时间】:2013-11-23 01:13:13
【问题描述】:
使用 Delphi / GDI 从裁剪 gregion 中排除圆角矩形的正确方法是什么?
ExcludeClipRect 可以排除矩形区域,CreateRoundRectRgn 和SelectClipRgn 可以将剪切区域设置为圆角矩形。
但我如何排除剪切区域中的圆形矩形(例如 ExcludeClipRoundRect 或 ExcludeClipRgn)?我尝试了CombineRgn,但没有成功。
【问题讨论】:
使用 Delphi / GDI 从裁剪 gregion 中排除圆角矩形的正确方法是什么?
ExcludeClipRect 可以排除矩形区域,CreateRoundRectRgn 和SelectClipRgn 可以将剪切区域设置为圆角矩形。
但我如何排除剪切区域中的圆形矩形(例如 ExcludeClipRoundRect 或 ExcludeClipRgn)?我尝试了CombineRgn,但没有成功。
【问题讨论】:
感谢@TLama 的评论,我能够这样解决它:
Region := CreateRectRgn (0, 0, ClientWidth, ClientHeight);
ExcludedRegion := CreateRoundRectRgn (1, 1, ClientWidth - 1, ClientHeight - 1, 3, 3);
CombineRgn (Region, Region, ExcludedRegion, RGN_XOR);
SelectClipRgn (Canvas.Handle, Region);
之前的问题是作为第一个参数传递给CombineRgn的区域还没有创建。链接教程中的一句话提供了线索:
还有一点需要指出的是,目的地区域在 CombineRgn 可以是源区域之一。
连同来自 MSDN 的这些信息:
hrgnDest [in]:一个新区域的句柄,其尺寸由两个组合定义 其他地区。 (在调用 CombineRgn 之前该区域必须存在。)
【讨论】:
作为已经使用的given answer 的替代方法,它允许定义一个更少的区域,是使用ExtSelectClipRgn:
ExcludedRegion := CreateRoundRectRgn (1, 1, ClientWidth - 1, ClientHeight - 1, 3, 3);
ExtSelectClipRgn(Canvas.Handle, ExcludedRegion, RGN_DIFF);
如果你不确定剪辑区域之前是否被修改过,想要重置区域,可以调用
SelectClipRgn(Canvas.Handle, 0);
在致电ExtSelectClipRgn之前。
【讨论】: