選択した領域を拡大したり縮小する機能を追加してみました。「猫」という字を拡大しています。

ラジオボタンで[範囲選択]が選択されていてCtrlボタンが押されているときに境界線をドラッグしたときにサイズ変更ができるようにしています。

条件は3つすべてを満たすときです。

[範囲選択]が選択されている
Ctrlボタンが押されている
クリックされているのは境界線のときだけ

コントロールキーがおされているかどうかは

かどうかを調べればわかりますが、PanelEx_MouseDownの中で調べるとクリックされてからCtrlボタンが押された場合に検出することができません。そこでDragOverイベントがおきたときに調べます。また途中でCtrlボタンをはなすと選択範囲の拡大ではなく移動の処理がはじまってしまうので、いったん領域の拡大縮小の処理がはじまったらマウスボタンから手がはなれるまで拡大縮小の処理のみをおこなうことにします。

BeginSelectSizeChangeイベントが発生したら以下の処理をおこないます。

まず拡大縮小される前の矩形の場所とサイズを調べて、フィールド変数に保存しています。

ドラッグによってサイズ変更されるのは、幅または高さだけなのか両方なのかはドラッグの開始が矩形の辺なのか角なのかで変わってきます。そこで矩形の左上、左下、右上、右下はサイズ変更時に固定されるのか変動するのかを最初に判定しています。

そのあと矩形の中の色をビットマップにして保存しています。これを矩形にあわせて拡大縮小すればいいわけです。

ドラッグされているあいだ変更後のサイズがわかるように矩形を描画することになりますが、このときに色が変わるパネルはSizeChangeSelectionXYsのなかに格納しています。

ドラッグされている最中は以下の処理がおこなわれます。

問題のOnSelectionSizeChangingメソッドですが、長なってしまった・・・

このOnSelectionSizeChangingメソッドのなかで使われているSetPanelColerOnSelectionSizeChangingメソッドとGetSelectedPanelsメソッドは以下のようになっています。

SetPanelColerOnSelectionSizeChangingメソッド内に

とありますが、これは拡大処理によって画像が崩れてしまうのを防ぐためにあります。これがないと下のようになってしまいます。

「猫」という文字を拡大しているのですが、非常に見づらいです。

ニアレストネイバー法とは単純に元の画像を水増したり間引きする方式です。拡大するときはピクセル数を増やさないといけませんが、そのときに一番近くにある色を使おうというわけです。ジャギーが目立ちやすく階調のある画像のリサイズにはむいていないとされていますが、アイコンであればニアレストネイバー法は適していると思われます。

ほかにもバイキュービック法もあり、精度が高く階調のある画像のリサイズにむいているとされていますが、アイコンのような小さな画像を扱う場合には適していないように思われます(試してみたが引き延ばされた画像の色が薄くなる)。

最後はドロップ時の処理です。

ドラッグが終わってドロップされたらイベントが発生し、Form1のなかではイベントハンドラBox_EndSelectSizeChangeが呼ばれます。