PaintEventArgs.ClipRectangle和PaintEventArgs.Graphics.ClipBounds有什么区别

时间:2012-08-21 19:50:01

标签: .net winforms

在System.Windows.Forms.Control的继承者中重写OnPaint或OnPaintBackground方法时,一个参数始终是System.Windows.Forms.PaintEventArgs对象。部分对象结构:

  • PaintEventArgs的
    • ClipRectangle (System.Drawing.Rectangle)
    • Graphics (System.Drawing.Graphics)
      • 剪辑(System.Drawing.Region)
      • ClipBounds (System.Drawing.RectangleF)
      • VisibleClipBounds (System.Drawing.RectangleF)

Graphics.Clip 似乎是适用于后续绘画操作的像素的1位地图。

  

MSDN:“获取或设置一个限制此图形的绘图区域的区域。”

Graphics.ClipBounds 是一个只读矩形,似乎是完全包含Clip区域的最小矩形。

  

MSDN:“获取一个RectangleF结构,该结构绑定了此Graphics的剪切区域。”

Graphics.VisibleClipBounds 似乎是一个更“智能”的剪辑,但我无法理解它是如何运作的。

  

MSDN:“获取此图形的可见剪裁区域的边界矩形。”

在所有情况下,

ClipRectangle 似乎都会复制Graphics.ClipBounds属性。

  

MSDN:“获取要绘制的矩形。”

有人可以回答主要问题并可能阐明所有各种边界对象的用途吗?

编辑:根据Dan-o的回答添加了MSDN的描述。

1 个答案:

答案 0 :(得分:12)

PaintEventArgs.ClipRectangle是Paint事件实际需要绘制的矩形。通常等于控件客户区的大小。当只有一部分与另一个窗口重叠时,它会更小。或者当您调用其Invalidate(Rectangle)方法时。您可以使用它来跳过绘制超出该矩形的昂贵对象。这是非常罕见的,Windows本身已经很好地削减了你绘制的内容。

Graphics.Clip是一个区域,您可以在绘图代码中指定它来剪裁您自己绘制的内容。它允许各种效果,例如绘制由圆圈剪裁的图像。或者使用转换为区域的GraphicsPath的非常复杂的剪切效果。

Graphics.ClipBounds是Graphics.Clip周围的矩形,它使得数学更快得到一阶估计,无论一个点是否在Graphics.Clip之外。如果您从未指定Clip属性(X = -4194304,Y = -4194304,Width = 8388608,Height = 8388608),您将获得无意义的“无限”剪辑边界

Graphics.VisibleClipBounds与Graphics.ClipBounds相同,但也被控制窗口剪切。如此有用的话可以测试一个点是否 in 用户可以看到Clip区域。如果您从未分配Clip属性,那么您只需获取窗口的大小。

因此,Windows设置了PaintEventArgs.ClipRectangle。其余部分由您通过分配Graphics.Clip属性来设置。

相关问题