スクロールバー付きのピクチャーボックスでBitmapを移動させます。Bitmapをドラッグで移動させる場合、その都度PictureBox.Imageにセットするbitmapを生成していては処理が重くなります。Paintイベントを処理することでBitmapを表示させます。

そのためにMovableBitmapクラスを作成します。PictureBoxプロパティは実際にBitmapが描画されるピクチャーボックスです。Bitmap, X, Y, Width, Heightプロパティが変更されるとPictureBox.Invalidate()を呼び出して再描画させます。

Keyプロパティは同じオブジェクトを探すための手がかりになる文字列です。

ScrollPictureBoxクラスにMovableBitmapオブジェクトを格納するリストを作成し、ここにMovableBitmapを格納するときにPictureBoxプロパティにpictureBox1をセットします。これでX、Yプロパティが変更されたときに表示場所が変更されます。

GetMovableBitmap(string key)メソッドはKeyプロパティから、GetFirstMovableBitmap(Point point)メソッドは座標(PictureBoxコントロール上の座標ではなくピクセル座標)から対応するMovableBitmapを探します。そしてPaintイベントが発生するとMovableBitmaps内のオブジェクトを適切な位置に描画します。

試運転。ダイアログで選択されたPngファイルを描画します。そして画像がドラッグされると移動処理をおこないます。

クリックされた場所にBitmapが存在するかGetFirstMovableBitmapメソッドで調べます。存在する場合はそのオブジェクトともとの位置をフィールド変数に保存します。マウスが移動するともとの位置と移動距離から新しいオブジェクトの位置を計算し、Bitmapをその場所に描画します。