CodeZine(コードジン)

特集ページ一覧

Windowsフォームアプリケーションにドラッグ&ドロップ機能を実装する

わずかな手間でユーザビリティがぐっと向上

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/07/17 14:00

Windowsフォームアプリケーションにドラッグ&ドロップ機能を組み込んで操作性を向上させる方法を学習します。

目次

はじめに

 一般的に、Windowsアプリケーション上に外部アプリケーションからデータをドラッグ&ドロップする際は、渡されるデータの構造や、データの使用に適した仕組みを見極める必要があります。

 ドラッグ&ドロップ機能の実装には手間がかかるため敬遠する開発者もいますが、ドラッグ&ドロップをサポートするとアプリケーションの有用性は大きく高まります。本稿では、Windowsフォームアプリケーションにドラッグ&ドロップ機能を実装する方法を紹介します。

ドラッグ&ドロップに関するイベントハンドラ

 あるコントロールから別のコントロールにオブジェクトをドラッグ&ドロップする方法を理解するには、いくつかのイベントハンドラについて理解しておく必要があります。図1の例を見てください。これは、PictureBoxコントロールに表示された画像を別のPictureBoxコントロールにドラッグするところを示しています。

図1 PictureBoxコントロールから別のPictureBoxコントロールに画像をドラッグする
図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プロパティが表示されないことにも注意してください。

編者注
 この記事の初出はCoDe Magazineの2008年3月/4月号で、本稿では許可を得て再掲しています。

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • Wei-Meng Lee(Wei-Meng Lee)

    Microsoft MVP受賞者。Microsoft社の最新テクノロジー実地研修を専門とするDeveloper Learning Solutions社を創設。.NETとワイヤレステクノロジーの開発者、指導者として知られる。国際的なカンファレンスでたびたび講演し、.NET、XML、ワイヤレステクノロジ...

  • japan.internet.com(ジャパンインターネットコム)

    japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.com や EarthWeb.c...

バックナンバー

連載:japan.internet.com翻訳記事

もっと読む

All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5