检查窗口是否包含表单

时间:2012-11-27 21:35:59

标签: c# winforms

我遇到了一个问题,我必须检查一个带有位置X和Y以及宽度和高度的表单是否包含在从具有矩形X,Y,宽度和高度的窗口中检索的矩形对象中。使用winforms时我有以下代码。如果你在窗口的边界之外,这段代码应该返回false!

if (!(this.Location.Y > rect.Y && this.Location.Y < ((rect.Y + rect.Height) - this.Height)) || !(this.Location.X > rect.X && rect.X < ((this.Location.X + rect.Width) - this.Width))) 

我使用以下代码获取矩形:

IntPtr hWnd = FindWindow(null, this.windowTitle);
            RECT rect;
            GetWindowRect(hWnd, out rect);

这是表单,rect是从窗口创建的矩形对象。

5 个答案:

答案 0 :(得分:3)

怎么样:

if(!(this.Location.Y > rect.Y && this.Location.X > rect.X && 
   this.Location.X < rect.X + rect.Width && this.Location.Y < rect.Y + rect.Height)){
   //...
}

答案 1 :(得分:1)

System.Drawing.Rectangle类有很好的方法。您可以使用rectangle1.Contains(rectangle2)

答案 2 :(得分:1)

你的问题基本上只是协调参考的问题。

不太复杂的想法是使用相同的函数来使用Form.Handle属性获取两个矩形,该属性基本上是一个句柄,就像FindWindow返回的一样:

 IntPtr hWnd = FindWindow(null, this.windowTitle);
 RECT rect1;
 GetWindowRect(hWnd, out rect);
 RECT rect2;
 GetWindowRect(form.handle, out rect);
 return rect2.Y >= rect1.Y && rect2.Y + rect2.Height <= rect1.Y + rect1.Height && rect2.X >= rect1.X && rect2.X + rect2.Width <= rect1.X + rect1.Width

答案 3 :(得分:1)

出于某种原因,您想编写一些半优化代码 -

if (!
  (this.Location.Y > rect.Y && 
   this.Location.Y < ((rect.Y + rect.Height) - this.Height))
 || 
  !
  (this.Location.X > rect.X && 
  rect.X < ((this.Location.X + rect.Width) - this.Width))) 
不幸的是,大多数人无法推断否定和或是相同的陈述。您还决定不比较每个角落,将顶部/左侧与其他矩形的相对角落和第一个矩形的大小的某些奇怪组合进行比较更有趣,以使条件更加复杂。

使用单个否定重写相同的条件,并且对于所有子条件的AND可能是正确的并且更具可读性(注意之前存在奇怪的非对称条件,现在都非常相似):

if (!
  (this.Location.Y > rect.Y && 
   this.Location.Y + this.Height < rect.Y + rect.Height &&
   this.Location.X > rect.X && 
   this.Location.X + this.Width < rect.X + rect.Width) 
) {}

答案 4 :(得分:0)

不确定你的要求究竟是什么,但如果我理解正确,这应该有效

    Rectangle rect = new Rectangle(-100,-100, 10, 10);
    if (this.ClientRectangle.IntersectsWith(rect))
    {
        // do stuff
    }