用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
之前。