【问题标题】:Is the documentation wrong for Graphics.IsVisible(Rectangle rect)?Graphics.IsVisible(Rectangle rect) 的文档是否错误?
【发布时间】: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


【解决方案1】:

我不了解文档,但我的经验与您的观察非常一致,如果矩形的任何部分在图形的可见剪辑区域内,该方法将返回 true。

不要想太多。文档永远不会像代码那样精确。任何大量文档都将包含此类不精确的定义。

【讨论】:

  • 事实上,读取点和矩形参数的许多重载,对我来说更像是复制和粘贴错误..:正确的点,而不是矩形..
  • 大部分微软的 SDK 和 API 文档现在都在 github 上。作为一个普通的最终用户,我自己已经改进了几个这样的文档部分,只是使用我的 github 帐户。如果贡献是连贯的并提高了质量,则 PR 很可能会在几天内获得其中一位内容经理的批准。
  • @CeeMcSharpface 很有趣。介意分享到 repo 的链接吗?
  • 我很高兴听到您的经验是该方法的作用就像人们希望的那样,但我仍然有点犹豫是否要依靠它这样做。文档中的不精确是可以理解的,但需要像代码中的错误一样解决(你可能会说,足够好还不够好)。像@CeeMcSharpface 这样的改进工作是值得欢迎的贡献。
猜你喜欢
  • 2016-10-31
  • 2011-04-01
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
相关资源
最近更新 更多