はじめに
一般的に、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
プロパティが表示されないことにも注意してください。