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

J C*_*ins 9 .net winforms

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

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

Graphics.Clip似乎是适用于后续绘制操作的像素的1位映射.

MSDN:"获取或设置一个限制此图形的绘图区域的区域."

Graphics.ClipBounds是一个只读矩形,看起来是完全包含Clip区域的最小矩形.

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

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

MSDN:"获取此Graphics的可见剪切区域的边界矩形."

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

MSDN:"获取要绘制的矩形."

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

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

Han*_*ant 13

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

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

Graphics.ClipBounds是Graphics.Clip周围的矩形,它使得数学运算更快,无论一个点是否在Graphics.Clip之外,都可以得到一阶估计.如果您从未指定Clip属性,则会得到无意义的"无限"剪辑边界(X = -4194304,Y = -4194304,宽度= 8388608,高度= 8388608)

Graphics.VisibleClipBounds与Graphics.ClipBounds相同,但也被控制窗口剪切.测试一个点是否 Clip区域内并且对用户可见是非常有用的.如果您从未分配Clip属性,那么您将获得窗口的大小.

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

  • 谢谢汉斯,这正是我想要的.我想知道你是否可以在答案中澄清每个操作的坐标系统(我知道可以有不同的单位,变换矩阵,父亲相对坐标等).另外我的印象是Graphics.Clip属性自动限制绘图形状,无需在离散绘图调用中引用.最后你能澄清"控制窗口"的含义吗? (2认同)