0

WindowsFormアプリケーションがあります。このアプリケーションでは、いくつかの円を描画するので 、自分自身を描画することを知っている「Circle」という名前のカスタムクラスがあります(このクラスには、 public void draw(Graphics g)メソッドがあります)

フォームが読み込まれ、いくつかの円を描画するときに、ユーザーが円をドラッグできるようにします。

だから私の質問は、カスタムクラスCircleにmouseHandlerを追加する方法ですか?このクラスには独自のmouseHandlerが必要だと思いましたが、その方法がわかりません。

4

1 に答える 1

1

Circleオブジェクトでマウスイベントを直接処理するには、Controlクラスから派生させる必要があります。これは大きな間違いです。Controlクラスにはいくつかの望ましくないプロパティがあり、シェイプドゥーダにはあまり適合しません。長方形のウィンドウであり、オーバーラップをうまくサポートしていないことから始めます。これらは修正可能ですが、かなり苦痛であり、すでに非常に高価なクラスにコストのかかるオーバーヘッドを追加するだけです。

代わりに、それを単なるクラスにします。メソッドを使用しbool HitTest(Point pos)ます。そしてメソッドvoid Move(Size dist)。そして、図形のリストを格納するShapeCollectionという名前の別のクラスを作成します。また、PaintメソッドとHitTestメソッドを使用すると、図形のコレクションを繰り返すだけです。

これで、フォームのPaintイベントを簡単に実装し、ShapeCollection.Paintメソッドを呼び出すことができます。また、MouseDownイベントを実装し、HitTestを呼び出して、trueを返した図形のインデックスを記憶することができます。そして、MouseMoveイベントを実装し、選択した図形に対してMoveを呼び出し、Invalidateを呼び出して、図形が新しい位置にペイントされるようにします。

WPFを使用する方が簡単で、Controlクラスと同じ問題はなく、シェイプサポートが組み込まれています。

于 2013-01-24T22:46:32.060 に答える