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

时间:2013-11-11 09:29:57

标签: windows delphi gdi

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

ExcludeClipRect排除矩形区域,CreateRoundRectRgnSelectClipRgn一起设置剪裁区域为圆角矩形。

但是我如何从裁剪区域排除圆形矩形(类似于ExcludeClipRoundRect或ExcludeClipRgn)?我尝试了CombineRgn,但没有让它发挥作用。

2 个答案:

答案 0 :(得分: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之前,该区域必须存在。)

答案 1 :(得分:2)

作为已经允许定义少一个区域的given answer的替代方法,可以使用ExtSelectClipRgn

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


如果你不确定裁剪区域是否未被修改过,并且想要重置区域,你可以打电话

SelectClipRgn(Canvas.Handle, 0);

在致电ExtSelectClipRgn之前。