今回は自由曲線によって選択された部分の移動をおこないます。

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

まず範囲選択がされている状態でクリックされた場合を考えます。

移動範囲は矩形ではないのでちょっと面倒です。Bitmapと同じサイズのビットマップを別に作成し、先に取得したborderPointsをつかって黒い線を描画します。そしてクリックされた座標に対応する部分を赤で塗りつぶします。そして赤い部分を集めればそれが選択された点の集合ということになります。

その点に対応する色を取得してColorPointのリストをつくります。ColorPointクラスはこのようになっています。

ColorPointクラス

ColorPointのリストに座標と色を格納したら、これをもとに移動元のビットマップを作成します。

移動元のビットマップの幅はcolorPointsの最大値と最小値から求めることができます。そして移動元のビットマップにSetPixelメソッドをつかって描画していきます。

それから移動するわけですから移動元は白抜きになります。そのためにCreateBlankBitmapメソッドを自作しています。

CreateBlankBitmapメソッド

次に範囲選択がされている状態でクリックされた場合の処理は以下のようになります。

OnMouseDownForMoveFreeLineSelectionメソッド

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

次に選択された部分が移動しているときの処理を考えます。

まずBitmapRectangleを移動させます。そしてblankColorPointsが存在する場合、その部分を白く描画します。そしてBitmapRectangleに格納されたデータを描画します。

OnMouseMoveForMoveFreeLineSelectionメソッド

マウスボタンが離されたときの処理

そしてマウスボタンが離されたらOnMouseUpForMoveFreeLineSelectionメソッドが呼ばれます。isMouseDownForMoveフラグをクリアして、BitmapRectangle.UpdatePositionメソッドをよびます。ここは矩形の移動と同じです。

UniteBitmapRectangleメソッドの修正

最後に移動したあと矩形以外の部分でマウスがクリックされるとUniteBitmapRectangleメソッドが呼ばれます。フィールド変数 blankColorPointsがあるので、このための処理を追加する必要があります。

初期化にかんする処理

移動の途中で新しくファイルを読み込んだときのことも考えて、移動のときに使用したフィールド変数などをクリアしておきます。