選択領域のサイズを変更できるだけでなく、編集領域のサイズそのものを変更できるようにします。

これはペイントですが、フィールドのサイズを変更するためのグリッパーが表示されています。そして範囲選択されているときはフィールドのサイズ変更用のグリッパーは非表示になります。

まずフィールドのサイズ変更用のグリッパーを表示させます。BitmapRectangle == nullのときは表示させてそうでないときは表示させません。またグリッパーを表示するのは下辺と右辺の中央と右下隅だけです。

スクロールバーを最適化するためのOptimizationScrloolBarですが、このとき表示させるビットマップはBitmapプロパティから取得されるものとは限らないので引数を追加しました。

フィールドのサイズ変更用のグリッパーが表示されているときにマウスポインタがグリッパーのうえに来たときにマウスポインタを変更します。

どこも選択されていないときにサイズ変更用のグリッパーのうえにマウスポインタがあるかどうか調べてマウスポインタを変更するのはChangeCursorWhenMouseMoveOnSelectionメソッドの役割です。そこでChangeCursorWhenMouseMoveOnSelectionメソッドを修正します。

BitmapRectangle == nullのときはこれまでCursor = Cursors.Default;としていただけですが、今回は処理をおこないます。

BitmapRectangle == nullのときにマウスがクリックされたら、サイズ変更用グリッパーのうえでクリックされたかどうか調べます。このときに呼び出されるのが自作メソッドIsMouseOnFirldGriperです。

isMouseDownForFieldSizeChangeフラグがセットされている状態でマウスが移動しているときはフィールドのサイズが変更されようとしているときです。そのときは自作メソッドOnMouseMoveForSizeChangeFieldを呼び出します。

フィールドのサイズが変更されようとしているときは、フィールド変数griperFieldに保存されているデータから新しいビットマップを作成します。

実際にBitmapプロパティを変更するのではなく、新しく作成したビットマップを表示します。

最後にマウスボタンが離されたときの処理です。isMouseDownForFieldSizeChangeフラグがセットされているときにマウスボタンが離されたら自作メソッドOnMouseUpForSizeChangeFieldを呼び出します。

それから範囲選択がされた場合はフィールドサイズ変更用のグリッパーを非表示にする必要があります。そのためOnMouseUpForSelectRectangleメソッドを一部修正しています。