0

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 はウィンドウから作成された四角形オブジェクトです。

4

5 に答える 5

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)){
   //...
}
于 2012-11-27T21:42:08.507 に答える
1

System.Drawing.Rectangleクラスには優れたメソッドがあります。使用できますrectangle1.Contains(rectangle2)

于 2012-11-27T21:42:27.307 に答える
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
于 2012-11-27T21:47:33.113 に答える
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 or は同じステートメントです。また、各コーナーを比較する代わりに、上/左を他の長方形の反対側のコーナーと最初の長方形のサイズの奇妙な組み合わせと比較して、条件をさらに複雑にする方が興味深いと判断しました。

すべてのサブ条件に対して単一の否定と 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) 
) {}
于 2012-11-27T21:57:21.977 に答える
0

あなたが何を求めているのか正確にはわかりませんが、私が正しく理解していれば、これはうまくいくはずです

    Rectangle rect = new Rectangle(-100,-100, 10, 10);
    if (this.ClientRectangle.IntersectsWith(rect))
    {
        // do stuff
    }
于 2012-11-27T21:46:41.007 に答える