如何使用Delphi / GDI从剪辑区域中正确地排除一个圆角矩形?
可以使用ExcludeClipRect方法来排除一个矩形区域,也可以使用CreateRoundRectRgn和SelectClipRgn方法将剪辑区域设置为圆角矩形。
但是我该如何从剪辑区域中排除一个圆角矩形(类似于ExcludeClipRoundRect或ExcludeClipRgn)?我尝试了CombineRgn方法,但没有成功。
如何使用Delphi / GDI从剪辑区域中正确地排除一个圆角矩形?
可以使用ExcludeClipRect方法来排除一个矩形区域,也可以使用CreateRoundRectRgn和SelectClipRgn方法将剪辑区域设置为圆角矩形。
但是我该如何从剪辑区域中排除一个圆角矩形(类似于ExcludeClipRoundRect或ExcludeClipRgn)?我尝试了CombineRgn方法,但没有成功。
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
的第一个参数所代表的区域并没有被创建。来自链接教程的一句话提供了线索:
再加上MSDN中的这些信息:还有一件事需要指出的是,CombineRgn中的目标区域可以是源区域之一。
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
之前。
RGN_XOR
的合并模式吗?顺便说一下,这里有一个相当不错的教程,例如在这里。 - TLamaRGN_DIFF
。但是在这种情况下并不重要,因为被排除的区域完全在内部。 - Sertac Akyuz