これまで範囲選択は矩形でおこなってきました。今回は自由曲線で領域を囲い込み、範囲選択された部分を移動させたりカットしたりコピーします。

では自由曲線で囲い込まれた領域をどのようにして認識すればいいでしょうか?

自由曲線で領域を囲い込む。その内部を塗りつぶしてこれを目印にすれば囲い込まれている部分とそうでない部分を区別することができるようになります。

メニューを追加

まずEditMode列挙体に自由曲線による範囲選択を追加します。

そして[自由曲線による範囲選択]が選択されたらメニューにチェックをつけます。

マウスがクリックされたときの処理

[範囲指定(自由曲線)]が選択されているときにクリックされたらOnMouseDownForSelectFreeAreaメソッドを呼びます。すでに自由曲線による範囲選択がおこなわれているときにクリックされたのであれば移動させる準備をします。

OnMouseDownForSelectFreeAreaメソッド

OnMouseDownForSelectFreeAreaメソッドがよばれたとき、自由曲線による範囲選択がされている場合とされていない場合があります。されていないときの処理は単に自由曲線の描画をするときとかわりません。

すでに範囲選択がされている場合は、移動の準備をします。また一度移動が完了してさらにもう一度クリックされた場合も考えられます。このときはクリックされた部分が範囲選択されている部分なのかどうかで処理をわけることになります。前者であれば再移動の準備をして、そうでない場合はBitmapを確定させることになります。

マウスを動かしたときの処理

マウスが移動したときの処理です。

[範囲指定(自由曲線)]が選択されているときであっても範囲指定がおこなわれようとしているときと、範囲指定された部分が移動しようとしているときはわけて考える必要があります。

OnMouseMoveForSelectFreeAreaメソッド

OnMouseMoveForSelectFreeAreaメソッドの内容は自由曲線を描画するときと同じです。

マウスボタンを離したときの処理

[範囲指定(自由曲線)]が選択されているときにマウスボタンが離されたときの処理を考えます。範囲選択が完了していない場合はOnMouseUpForSelectFreeAreaメソッドが呼ばれます。移動されているときで移動が完了した場合はOnMouseUpForMoveFreeLineSelectionが呼ばれます。

OnMouseUpForSelectFreeAreaメソッド

OnMouseUpForSelectFreeAreaメソッドは単に自由曲線を描画する処理とは違う部分があります。自由曲線でかこまれた境界線を保存します。

GetBorderPointsFromFreeLineメソッド

GetBorderPointsFromFreeLineメソッドは境界線を構成する点を取得するメソッドです。

以上、自由曲線で範囲選択をするときの処理でした。次回は実際に移動させます。

自由曲線によって範囲選択された部分の移動 C#で簡易画像編集ソフトをつくる(その17)