OLE のドラッグ アンド ドロップ

OLE のドラッグ アンド ドロップ機能は、主にデータのコピーと貼り付けを行うためのショートカットです。 クリップボードを使用してデータをコピーして貼り付けるには、手順がいくつか必要です。 データを選択し、[編集] メニュー から [切り取り] または [ コピー] を選択します。 次に、コピー/移動先のアプリまたはウィンドウに移動し、ターゲットの場所にカーソルを置きます。 最後に、メニューから [編集]>[貼り付け] を選択します。

OLE のドラッグ アンド ドロップ機能は、ファイル マネージャーのドラッグ アンド ドロップ メカニズムとは異なります。 ファイル マネージャーが処理できるのはファイル名のみで、特にファイル名をアプリケーションに渡すために設計されています。 OLE でのドラッグ アンド ドロップは、もっと一般的です。 クリップボードにも配置できる、あらゆるデータをドラッグ アンド ドロップできます。

OLE ドラッグ アンド ドロップを使用する場合は、プロセスから 2 つのステップを削除します。 ソース ウィンドウ ("ドロップ ソース") からデータを選択し、目的の場所 ("ドロップ ターゲット") にドラッグします。 ドロップするには、マウス ボタンを離します。 この操作により、メニューが不要になります。また、コピーして貼り付けるよりも高速です。 条件は 1 つだけです。つまり、ドロップ ソースとドロップ ターゲットの両方が開いていて、少なくとも画面の一部が表示されている必要があります。

OLE ドラッグ アンド ドロップにより、ある場所から別の場所へのデータ移動、たとえば、ドキュメント内、異なるドキュメント間、アプリケーション間でのデータ移動を簡単に行うことができます。 これは、コンテナー内またはサーバー アプリケーション内のいずれかに実装できます。 どのアプリケーションでも、ドロップ ソース、ロップ ターゲット、あるいはその両方になることができます。 アプリケーションでドロップ ソースとドロップターゲットの両方のサポートが実装されている場合は、子ウィンドウ間または 1 つのウィンドウ内でドラッグ アンド ドロップできます。 この機能により、ご自身のアプリケーションが格段に使いやすくなります。

データ オブジェクトとデータ ソース (OLE)の記事では、お使いのアプリケーション内でのデータ転送を実装する方法について説明します。 また、これは、MFC OLE サンプルの OCLIENTHIERSVR を調査するのにも役立ちます。

ドロップ ソースを実装する

お使いのアプリケーションのデータでドラッグ アンド ドロップ操作を行えるようにするには、ドロップ ソースを実装します。 ドロップ ソースの基本的な実装は比較的簡単です。 最初に、ドラッグ操作を開始するイベントを決めます。 推奨されるユーザー インターフェイス ガイドラインの定義では、ドラッグ操作は、選択されたデータ内のポイントで WM_LBUTTONDOWN イベントが発生したときに始まります。 MFC OLE サンプルの OCLIENT HIERSVR は、次のガイドラインに従っています。

ご自身のアプリケーションがコンテナーで、選択したデータが、COleClientItem 型のリンク オブジェクトまたは埋め込みオブジェクトである場合は、その DoDragDrop メンバー関数を呼び出します。 それ以外の場合は、COleDataSource オブジェクトを構築し、選択した内容で初期化して、データ ソース オブジェクトの DoDragDrop メンバー関数を呼び出します。 お使いのアプリケーションがサーバーの場合は、COleServerItem::DoDragDrop を使用します。 標準のドラッグ アンド ドロップ動作のカスタマイズについては、「ドラッグ アンド ドロップをカスタマイズする」を参照してください。

DoDragDrop によって DROPEFFECT_MOVE が返された場合は、ソース ドキュメントからソース データを直ちに削除します。 DoDragDrop からの他の戻り値はドロップ ソースに影響しません。

詳細については、「 OLE データ オブジェクトとデータ ソース: 作成と破棄」および 「OLE データ オブジェクトとデータ ソース: 操作」を参照してください。

ドロップ ターゲットを実装する

ドロップ ターゲットを実装するには、ドロップ ソースよりも少し多くの作業が必要ですが、それでも比較的簡単です。

OLE ドロップ ターゲットを実装するには

  1. ご自身のアプリケーションの InitInstance メンバー関数内で、AfxOleInit の呼び出しを追加します。 この呼び出しは、OLE ライブラリを初期化するのに必要です。

  2. ドロップ ターゲットにするアプリケーション内の各ビューにメンバー変数を追加します。 このメンバー変数は、COleDropTarget 型またはその型から派生したクラスである必要があります。

  3. WM_CREATE メッセージ (通常は OnCreate) を処理するご自身のビュー クラスの関数から、新しいメンバー変数の Register メンバー関数を呼び出します。 ご自身のビューが破棄されると、Revoke が自動的に呼び出されます。

  4. 次の関数をオーバーライドします。 アプリケーション全体で同じ動作が必要な場合は、ご自身のビュー クラスでこれらの関数をオーバーライドします。 特殊なケースで動作を変更する場合、または CView 以外のウィンドウでのドロップを有効にする場合は、ご自身の COleDropTarget 派生クラス内でこれらの関数をオーバーライドします。

    上書き 許可
    OnDragEnter ウィンドウで発生するドロップ操作。 カーソルが最初にウィンドウに入ったときに呼び出されます。
    OnDragLeave 指定されたウィンドウからドラッグ操作が離れるときの特殊な動作。
    OnDragOver ウィンドウで発生するドロップ操作。 カーソルがウィンドウの中をドラッグされているときに呼び出されます。
    OnDrop 指定されたウィンドウにドロップされるデータの処理。
    OnScrollBy ターゲット ウィンドウ内でスクロールが必要なときの特別な動作。

これらの関数がどのように連携するかを示す例については、MFC OLE サンプル OCLIENT に含まれる MAINVIEW.CPP ファイルをご覧ください。

詳細については、「 OLE データ オブジェクトとデータ ソース: 作成と破棄」および 「OLE データ オブジェクトとデータ ソース: 操作」を参照してください。

ドラッグ アンド ドロップをカスタマイズする

ほとんどのアプリケーションで、ドラッグ アンド ドロップ機能は既定の実装で十分です。 ただし、アプリケーションによっては、この標準の動作の変更が必要になる場合があります。 このセクションでは、こうした既定の動作の変更に必要な手順について説明します。 この手法を使用すると、複合ドキュメントがサポートされていないアプリケーションを、ドロップ ソースにすることができます。

標準の OLE ドラッグ アンド ドロップ動作をカスタマイズする場合、または OLE 以外のアプリケーションがある場合は、データを格納する COleDataSource オブジェクトを作成する必要があります。 ユーザーがドラッグ アンド ドロップ操作を開始するとき、DoDragDrop 関数は、ドラッグ アンド ドロップ操作をサポートする他のクラスからではなく、このコードから、ご自身のコードによって呼び出す必要があります。

必要に応じて、COleDropSource オブジェクトを作成してドロップを制御し、変更する動作の種類に応じてその関数の一部をオーバーライドできます。 このドロップ ソース オブジェクトは、その後、これらの関数の既定の動作を変更するために COleDataSource::DoDragDrop に渡されます。 これらのさまざまなオプションにより、非常に柔軟に、ご自身のアプリケーションでのドラッグ アンド ドロップ操作をサポートする方法を決めることができます。 データ ソースの詳細については、「データ オブジェクトとデータ ソース (OLE)」を参照してください。

次の関数はオーバーライドして、ドラッグ アンド ドロップ操作をカスタマイズできます。

上書き カスタマイズ
OnBeginDrag DoDragDrop を呼び出した後にドラッグ操作を開始する方法。
GiveFeedback ドロップ結果に応じたビジュアル フィードバック (カーソルの外観など)。
QueryContinueDrag ドラッグ アンド ドロップ操作の終了。 この関数を使用すると、ドラッグ操作中に修飾キーの状態を確認できます。

関連項目

OLE
OLE データ オブジェクトとデータ ソース
OLE データ オブジェクトとデータ ソース : 作成と破棄
OLE データ オブジェクトとデータ ソース : 操作
COleClientItem::DoDragDrop
COleDataSource クラス
COleDataSource::DoDragDrop
COleDropSource クラス
COleDropTarget クラス
CView::OnDragLeave