.net PaintEventArgs.ClipRectangle和PaintEventArgs.Graphics.ClipBounds之间有什么区别

.net PaintEventArgs.ClipRectangle和PaintEventArgs.Graphics.ClipBounds之间有什么区别,.net,winforms,.net,Winforms,在System.Windows.Forms.Control的继承器中重写OnPaint或OnPaintBackground方法时,一个参数始终是System.Windows.Forms.PaintEventArgs对象。部分对象结构: PaintEventArgs ClipRectangle(系统图矩形) 图形(系统.绘图.图形) 剪辑(系统.绘图.区域) 剪贴簿(系统.绘图.矩形F) 可视剪贴簿(系统.绘图.矩形F) 图形。Clip似乎是在后续绘制操作中影响的适用像素的1位映射 M

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

  • PaintEventArgs
    • ClipRectangle(系统图矩形)
    • 图形(系统.绘图.图形)
      • 剪辑(系统.绘图.区域)
      • 剪贴簿(系统.绘图.矩形F)
      • 可视剪贴簿(系统.绘图.矩形F)
图形。Clip似乎是在后续绘制操作中影响的适用像素的1位映射

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

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

MSDN:“获取一个矩形结构,该结构限制此图形的剪裁区域。”

图形。可视剪贴簿似乎是一个更“智能”的剪贴簿,尽管我无法理解它是如何运作的

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

ClipRectangle在所有情况下都会重复Graphics.ClipBounds属性

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

有人能回答这个主要问题,并有可能阐明各种边界对象的用途吗


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

PaintEventArgs.ClipRectangle是实际需要由您的绘画事件绘制的矩形。通常等于控件的客户端区域的大小。当它的一部分被另一个窗口重叠时,它会变小。或者当您调用它的Invalidate(Rectangle)方法时。可以使用它跳过绘制位于该矩形之外的昂贵对象。这是非常罕见的,Windows本身已经很好地剪辑了您绘制的内容

图形.剪裁是一个区域,您可以在绘图代码中指定该区域来剪裁自己绘制的内容。它允许各种各样的效果,比如画一个被圆圈剪裁的图像。或者使用转换为区域的GraphicsPath实现非常复杂的剪裁效果

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

Graphics.VisibleClipBounds与Graphics.ClipBounds相同,但也被控制窗口剪裁。因此,测试一个点是否位于剪辑区域内并对用户可见非常有用。如果从不指定“剪辑”属性,则只需获得窗口的大小


因此,是Windows设置了PaintEventArgs.ClipRectangle。其余部分由您通过指定Graphics.Clip属性进行设置。

谢谢Hans,这正是我想要的。我想知道您是否可以在回答中澄清每个操作的坐标系(我知道可能有不同的单位、变换矩阵、父相对坐标等)。此外,我对图形有印象。Clip属性自动限制图形形状,而无需在离散图形调用中引用。最后,你能解释一下“控制窗口”是什么意思吗?在这个答案中,“Graphics.ClipRectangle”这两个地方应该是“PaintEventArgs.ClipRectangle”,对吗?Dan-o也许我遗漏了什么,但对我来说,它们听起来像是财产名称中动词的复述。我知道如何使用MSDN(两个链接都已经访问过),并且可以阅读IntelliSense帮助(这些确切的短语),但问题显然表明需要更多的信息。如果有一个区域和一个矩形,那么事情是有意义的,但至少有四个潜在的不同区域。我希望看到每一个段落都能正确理解这种情况。