【问题标题】:Exclude round rectangle from clipping region?从剪切区域中排除圆角矩形?
【发布时间】:2013-11-23 01:13:13
【问题描述】:

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

ExcludeClipRect 可以排除矩形区域,CreateRoundRectRgn 和SelectClipRgn 可以将剪切区域设置为圆角矩形。

但我如何排除剪切区域中的圆形矩形(例如 ExcludeClipRoundRect 或 ExcludeClipRgn)?我尝试了CombineRgn,但没有成功。

【问题讨论】:

  • 你试过RGN_XOR组合模式吗?顺便提一句。相当不错的教程是e.g. here。
  • @TLama - 要排除一个区域,您需要RGN_DIFF。但这并不重要,因为排除区域完全在内部。

标签: windows delphi gdi


【解决方案1】:

感谢@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 之前该区域必须存在。)

【讨论】:

    【解决方案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之前。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 2018-10-30
      • 2012-05-10
      • 2021-05-31
      • 2019-05-27
      相关资源
      最近更新 更多