ドラッグ & ドロップを処理する

テキスト、ビットマップイメージ、ファイルといった通常のオブジェクトは、以下のような処理でドラッグ & ドロップを処理できます。
srcPictureBox と dstPictureBox の2つのPictureBoxがあり、srcPictureBoxからdstPictureBoxへドラッグ & ドロップする例です。 srcPictureBoxにはMouseMoveイベントハンドラ、dstPictureBoxにはDragEnter, DragDropイベントハンドラを実装しています。 また、dstPictureBoxのAllowDropプロパティをtrueにセットしています。
srcPictureBoxには、ビットマップイメージが既にセットされていることを前提にしています。
※ EMF/WMF形式のイメージの場合は、ここの例ではうまくいきません。こちらを参照してください。
public DragAndDropTestForm()
{
    InitializeComponent();
    dstPictureBox.AllowDrop = true; // Drag & Dropを許可する
}

// ドラッグ元: ドラッグを開始する
private void srcPictureBox_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        DataObject dataObj = new DataObject(srcPictureBox.Image);
        ((PictureBox)sender).DoDragDrop(dataObj, DragDropEffects.Copy);
    }
}

// ドラッグ先: 受け入れ可であることを示す
private void dstPictureBox_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.Bitmap)) e.Effect = DragDropEffects.Copy;
    else e.Effect = DragDropEffects.None;
}

// ドラッグ先: ドロップを受け入れる
private void dstPictureBox_DragDrop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.Bitmap))
    {
        string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
        dstPictureBox.Image = (Bitmap)e.Data.GetData(DataFormats.Bitmap);
    }
}