はじめに
一般的に、Windowsアプリケーション上に外部アプリケーションからデータをドラッグ&ドロップする際は、渡されるデータの構造や、データの使用に適した仕組みを見極める必要があります。
ドラッグ&ドロップ機能の実装には手間がかかるため敬遠する開発者もいますが、ドラッグ&ドロップをサポートするとアプリケーションの有用性は大きく高まります。本稿では、Windowsフォームアプリケーションにドラッグ&ドロップ機能を実装する方法を紹介します。
ドラッグ&ドロップに関するイベントハンドラ
あるコントロールから別のコントロールにオブジェクトをドラッグ&ドロップする方法を理解するには、いくつかのイベントハンドラについて理解しておく必要があります。図1の例を見てください。これは、PictureBoxコントロールに表示された画像を別のPictureBoxコントロールにドラッグするところを示しています。

ドラッグ&ドロップ機能を実装するには、両方のコントロールに対するコードを記述します。
ドラッグするコントロールのコード
ドラッグしようとするデータのロード処理の起点は、通常はMouseDownまたはMouseMoveイベントになります。図1の例では、このどちらかのイベントで、左側のPictureBoxコントロールに格納されている画像をクリップボードにコピーします。
ドラッグ操作の結果、つまり、ユーザーが最終的にアイテムをドロップしたかどうかは、QueryContinueDragイベントで知ることができます。移動を目的とするドラッグ操作をユーザーが正しくやり遂げた場合は、左側のPictureBoxコントロールにある画像を削除する必要があるでしょう。
ドラッグ元のコントロールは、ドラッグ操作の間はGiveFeedBackイベントを送出し続けます。マウスポインタの外観を変更したい場合は、このイベントで処理できます。
ドロップを受け入れるコントロールのコード
ドロップを受け入れるコントロールの領域にマウスが入ると、そのコントロールはDragEnterイベントを送出します。通常は、このイベントのイベントハンドラに、実行中の処理(コピーや移動など)を反映するようにマウスポインタの形状を変化させるコードを記述します。さらに、そのコントロールの外観を変化させて、ドロップ先であることがすぐに分かるようにすることもできます。
ドロップを受け入れるコントロールの上にマウスがとどまっている間、そのコントロールはDragOverイベントを送出します。このイベントは、ターゲットのコントロール上にマウスがある間はずっと発生し続けます。このイベントまたはDragEnterイベントを使用して、マウスポインタの外観を変更できます。
ドロップを受け入れるコントロールからマウスが離れると、そのコントロールはDragLeaveイベントを送出します。DragEnterイベントでコントロールの外観を変更していた場合は、通常はこのイベントのイベントハンドラで元に戻します。
ドロップを受け入れるコントロールの上でオブジェクトをドロップすると、DragDropイベントが発生するので、このイベントを適切に処理します。図1の例では、左側のコントロールからドラッグした画像を、右側のPictureBoxコントロールにロードすることになります。
ここで説明した一連のイベントが、すべてのコントロールでサポートされているわけではないことに注目してください。例えば、RichTextBoxコントロールはDragOverイベントをサポートしません。従って、ドラッグ&ドロップを検知するには、DragEnterイベントなど、サポートされている別のイベントを使用する必要があります。
また、ほとんどのコントロールでは、デザイン時にプロパティウィンドウでAllowDropプロパティを設定できます。しかし、いくつかのコントロール(PictureBoxコントロールなど)では、プロパティウィンドウにAllowDropプロパティが表示されません。従って、コードの中で動的に設定する必要があります。さらに、Visual Studioの入力支援機能(インテリセンス)でAllowDropプロパティが表示されないことにも注意してください。
