使用Delphi / GDI从剪辑区域中排除圆角矩形的正确方法是什么?
ExcludeClipRect排除矩形区域,CreateRoundRectRgn与SelectClipRgn一起设置剪裁区域为圆角矩形。
但是我如何从裁剪区域排除圆形矩形(类似于ExcludeClipRoundRect或ExcludeClipRgn)?我尝试了CombineRgn,但没有让它发挥作用。
答案 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
之前。