从剪辑区域排除圆形的矩形?

用Delphi / GDI从剪贴簿格雷格排除圆形矩形的正确方法是什么?

有ExcludeClipRect排除一个矩形区域,并有CreateRoundRectRgn与SelectClipRgn一起设置剪切区域为一个圆形的矩形。

但是,我怎样才能从裁剪区域排除一个圆形的rectange(如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之前,该区域必须存在。)

作为已经给出的答案的替代方案,可以定义一个更少的区域,就是使用ExtSelectClipRgn

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

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

 SelectClipRgn(Canvas.Handle, 0); 

在调用ExtSelectClipRgn之前。