从剪切区域中排除圆角矩形?

4

如何使用Delphi / GDI从剪辑区域中正确地排除一个圆角矩形?

可以使用ExcludeClipRect方法来排除一个矩形区域,也可以使用CreateRoundRectRgnSelectClipRgn方法将剪辑区域设置为圆角矩形。

但是我该如何从剪辑区域中排除一个圆角矩形(类似于ExcludeClipRoundRect或ExcludeClipRgn)?我尝试了CombineRgn方法,但没有成功。


4
你尝试过使用 RGN_XOR 的合并模式吗?顺便说一下,这里有一个相当不错的教程,例如在这里。 - TLama
1
@TLama - 要排除一个区域,您需要使用RGN_DIFF。但是在这种情况下并不重要,因为被排除的区域完全在内部。 - Sertac Akyuz
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之前,此区域必须存在。)


2
作为给出答案的替代方案,可以使用ExtSelectClipRgn来定义少一个区域。
ExcludedRegion := CreateRoundRectRgn (1, 1, ClientWidth - 1, ClientHeight - 1, 3, 3);
ExtSelectClipRgn(Canvas.Handle, ExcludedRegion, RGN_DIFF);

如果您不确定剪辑区域之前是否已被修改并想要重置该区域,您可以调用...
SelectClipRgn(Canvas.Handle, 0);

在调用 ExtSelectClipRgn 之前。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接