レイヤーをドラッグすることでサイズ変更できるようにします。まずコンテキストメニューを表示するクラスの追加部分を示します。右クリックされると[レイヤー XXX のサイズを変更する]という項目が表示されます。そしてクリックするとItem_Click4が実行され、フィールド変数 SizeChangingLayerにそのレイヤーが格納され、そのレイヤーがある部分がグリッパー付きの枠で囲われます。

これはグリッパ付きの枠を表示するためのクラスです。レイヤーを引数にしてグリッパー付きの枠のBitmapと、グリッパーの位置を取得することができます。

Form1クラス内でサイズ変更が可能なときにクリックすると、レイヤーのどの部分でクリックされたかを調べます。レイヤーの外ならサイズ変更の処理は終わりです。グリッパーの上であればサイズ変更の準備をします。グリッパーによってどのほうこうに拡大縮小するのかが違ってきます。そのような情報をLayerSizeChangeオブジェクト内に格納して、これをcontextMenuEx1のフィールド変数LayerSizeChangeにセットします。

LayerSizeChangeクラスはこのようになっています。コンストラクタでレイヤーやクリックされたグリッパー、ドラッグが開始された座標などをフィールド変数に格納することで拡大縮小ができるようにしています。またグリッパーがクリックされずにドラッグされた場合は通常の移動になります。では昨日の作業はなんだのか?

contextMenuEx1のフィールド変数にLayerSizeChangeオブジェクトが格納されている状態でマウスをドラッグするとサイズ変更が行なわれます。マウスボタンを離したあとであっても、レイヤーのない部分をクリックしたり、右クリックしない限り、同じであればレイヤーのサイズ変更ができます。

サイズ変更がおこなわれるとLayerSizeChange.SizeChangeLayer()メソッドによってScroolPictureBoxの再描画が行なわれます。