ユーザーがフォーム上のパネルをドラッグできるようにするクラスを作成しました。ユーザーが2つのパネルを重ねないようにするにはどうすればよいですか?もしそうなら、両方が重なっている間にコントロールの1つをシフト/ハイライトしたいと思います。
OnMouseDownイベントでこれを設定しようとしましたが、うまくいきませんでした。
また、フォームのパネルの数は、フォームに表示する必要のある写真の数によって異なります。各パネルには、パネル内にピクチャーボックスがあります。
ユーザーがフォーム上のパネルをドラッグできるようにするクラスを作成しました。ユーザーが2つのパネルを重ねないようにするにはどうすればよいですか?もしそうなら、両方が重なっている間にコントロールの1つをシフト/ハイライトしたいと思います。
OnMouseDownイベントでこれを設定しようとしましたが、うまくいきませんでした。
また、フォームのパネルの数は、フォームに表示する必要のある写真の数によって異なります。各パネルには、パネル内にピクチャーボックスがあります。
はるかに優れたアプローチは、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!
}
}
少し前にこの質問をしたにもかかわらず、これが役に立てば幸いです。
したがって、sgudの提案の助けを借りて、この質問を解決することができました。
トリックは、発生した OnMouseUp イベント内で Rectangle.Intersect メソッドを使用することでした。
これが私がその背後で使用した直感です。(それは最もきちんとした解決策ではないかもしれません)
1) メイン パネル内のすべてのコントロールのリストを作成します。
2) コントロールをトラバースし、各コントロールのすべての Rectangle Bounds のリストを作成します。これは control.Bounds で取得できます
3) Bounds のリストを調べて、現在アクティブな要素の境界と交差します。
返された四角形の高さと幅がアクティブなコントロールと同じである場合は、back color プロパティを変更します。
これが同様の問題を抱えている他の人の助けになることを願っています