10

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

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

Graphics.Clip似乎是适用像素的 1 位图,以影响后续绘制操作。

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

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

MSDN:“获取限制此图形的剪切区域的 RectangleF 结构。”

Graphics.VisibleClipBounds似乎是一个更“智能”的剪辑,虽然我不明白它是如何运作的。

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

ClipRectangle似乎在所有情况下都复制了 Graphics.ClipBounds 属性。

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

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

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

4

1 回答 1

15

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 相同,但也被控制窗口裁剪。测试一个点是否剪辑区域内并对用户可见非常有用。如果您从不分配 Clip 属性,那么您只会得到窗口的大小。

所以是 Windows 设置了 PaintEventArgs.ClipRectangle。其余部分由您通过分配 Graphics.Clip 属性来设置。

于 2012-08-21T20:45:03.217 回答