2012-12-17 4 views
8

ユーザーがフォーム上でパネルをドラッグできるようにするクラスを作成しました。 は、ユーザーが2つのパネルを重ねて配置しないようにするにはどうすればよいですか?もしそうであれば、コントロールのどちらかが重なっている間にコントロールの1つをシフト/ハイライトしたいと思います。Windowsフォームで2つのコントロールが重なっているかどうかを確認する方法

これをOnMouseDownイベントで設定しようとしましたが、うまくいきませんでした。

また、フォーム上のパネルの数は、フォームに表示する必要がある画像の数によって異なります。各パネルにはパネル内にピクチャボックスがあります。

+0

新しいパネルのドロップ位置が既に存在する場合は、既存のパネルすべてをチェックしてみることができます。あなたはちょうど場所とコントロールのサイズでいくつかの数学を持っている必要があります。 – sgud

答えて

1

私はsgudの提案の助けを借りてこの問題を解決することができました。

トリックは、発生したOnMouseUpイベント内でRectangle.Intersectメソッドを使用することでした。

ここで私が直面している直感です。 (最善の解決策ではないかもしれません)

1)メインパネル内のすべてのコントロールのリストを作成します。

2)コントロールを横断し、各コントロールのすべての矩形の境界のリストを作成します。あなたはこれをcontrol.Boundsで得ることができます。

3)Boundsのリストを通り、現在アクティブな要素の境界と交差します。
戻り値の矩形の高さと幅がアクティブなコントロールと同じ場合は、バックカラープロパティを変更します。

私は、これは同様の問題

7

より良いアプローチは、あなたのためのチェックを行い、クリーンなコードを生成することができますRectangle.Bounds.IntersectsWithメソッドを使用することですを持っている誰にも役立ちます願っています。私は個人的にパフォーマンスの問題や利点、いずれか他の方法を認識していませんが、私は単純にあなたのコントロールをループし、これらをチェックすることはリストとループの両方を構築するよりも速くなるだろうと推測します。

Picturebox pic = new Picturebox(); 
foreach(Control picturebox in Form1){ 
    if (pic.Bounds.IntersectsWith(picturebox.Bounds)) 
    { 
     //We have a problem, Houston, because we just collided! 
    } 
} 

この質問をしばらくお待ちしていましたが、これが役立つことを願っています。

+0

私はこの機能を調べて、うまくいくかのように見えます。しかし、私はこのプロジェクトでもう働かないので、テストすることはできません。しかし、ありがとう。 –

関連する問題