【发布时间】:2021-05-07 00:05:42
【问题描述】:
Microsoft 的在线文档说,此 Graphics 方法返回“如果 rect 参数指定的矩形包含在此 Graphics 的可见剪辑区域内,则返回 true;否则返回 false”。
他们真的是那个意思吗?如果 rect 的任何部分位于剪辑区域内,让它返回 true 会更有用。这样,如果 rect 是要绘制的某个对象的边界矩形,您就会知道是否没有对象在视图中,并且可以安全地跳过它。
我已经尝试了一些非常简单的 WinForms 代码,并且该方法的行为确实符合我的意愿,而不是文档中所说的那样。但我不愿意假设我是对的。有人确定吗?
当我在谈论这方面的文档时,是否有人定义了“可见剪辑区域”?微软说它是“这个 Graphics 的剪辑区域和窗口的剪辑区域的交集”,但肯定不止于此:例如,某些 Graphics 对象甚至没有窗口(如果它们re 与内存中的位图相关联)。
实验表明,例如,如果您在大小为 X x Y 的矩形面板上绘画,则 Graphics 剪辑区域与 X x Y 矩形相交。显然,如果 Panel 大于其包含的 Form 并且部分滚动到视野之外,这将继续适用。但同样,最好知道实际规则是什么。
所有积累的智慧都被感激地接受。
【问题讨论】:
-
你可以尝试多次使用 Graphics.IsVisible(point) 重载..
-
What is the difference between PaintEventArgs.ClipRectangle and PaintEventArgs.Graphics.ClipBounds。请注意,矩形有四个顶点,因此有四个已知点。
Graphics.IsVisible()和GraphicsPath.IsVisible()对 Point 也有重载。您可以构建扩展方法或使用标准数学来执行特定计算。此外,底层的 Graphics 过程(和 BufferedGraphics)足够聪明,可以知道何时需要绘制某些东西。 -
@Jimi 是的,我在几天前发现了 Hans Passant 的回答,发现它很有帮助 - 它解决了很多问题。不幸的是,他没有定义“控制窗口”,所以仍然存在一些谜题。关于 IsVisible 的 Point 重载,矩形的所有四个顶点都可能在剪切区域之外,但某些部分可能在内部。您无法击败专门构建的矩形测试 - 如果这就是我们所拥有的!
-
我们拥有的远不止这些(另外,两个顶点定义了其他点的位置,如直线中间的点):一个剪切区域(一个Region)对象和矩形有互补, Exclude、Intersect、Union、XOR 方法也适用于其他对象 - 作为 GraphicsPath - 因此您可以确定两个区域或矩形的交集(参见
GetBounds()方法)是否为空。另外,是的,使用标准数学和基本几何,您可以击败需要互操作 (PInvoke) 的本机 GDI+ 函数。 -
但是,关于 GDI+ 的 .Net 文档及其功能、工具和属性,请参阅我在这里写的内容:Disable Image blending on a PictureBox -- 我不确定 Window 概念:所有控件都有一个 Window,它(在此上下文中)定义了它的边界,当然,还定义了与彼此及其父容器、剪辑区域的交互。其他对象,作为位图,没有Window,但有边界——深入研究。
标签: c# .net winforms visibility