4

使用 Delphi / GDI 从裁剪 gregion 中排除圆角矩形的正确方法是什么?

ExcludeClipRect可以排除矩形区域,CreateRoundRectRgn和SelectClipRgn一起将剪切区域设置为圆角矩形。

但是如何从剪辑区域中排除圆形矩形(例如 ExcludeClipRoundRect 或 ExcludeClipRgn)?我尝试了CombineRgn,但没有让它工作。

4

2 回答 2

6

感谢@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 之前存在。)

于 2013-11-11T10:03:36.813 回答
2

作为已经给出的答案的替代方案,这将允许定义一个更少的区域,是使用ExtSelectClipRgn

ExcludedRegion := CreateRoundRectRgn (1, 1, ClientWidth - 1, ClientHeight - 1, 3, 3);
ExtSelectClipRgn(Canvas.Handle, ExcludedRegion, RGN_DIFF);


如果您不确定剪辑区域之前是否未修改,并且想要重置该区域,您可以调用

SelectClipRgn(Canvas.Handle, 0);

打电话之前ExtSelectClipRgn

于 2013-11-11T22:16:31.430 回答