OLE のドラッグ アンド ドロップ機能は、主にデータのコピーと貼り付けのショートカットです。 クリップボードを使用してデータをコピーまたは貼り付ける場合は、いくつかの手順が必要です。 データを選択し、[編集] メニューから [切り取り] または [コピー] を選択します。 次に、移動先のアプリまたはウィンドウに移動し、ターゲットの場所にカーソルを置きます。 最後に、メニューから [編集>パス] を選択します。
OLE ドラッグ アンド ドロップ機能は、ファイル マネージャーのドラッグ アンド ドロップ メカニズムとは異なります。 ファイル マネージャーはファイル名のみを処理でき、ファイル名をアプリケーションに渡すために特別に設計されています。 OLE でのドラッグ アンド ドロップの方がはるかに一般的です。 クリップボードに配置できるデータをドラッグ アンド ドロップできます。
OLE ドラッグ アンド ドロップを使用する場合は、プロセスから 2 つのステップを削除します。 ソース ウィンドウ ("ドロップ ソース") からデータを選択し、コピー先 ("ドロップ ターゲット" ) にドラッグします。 マウス ボタンを離してドロップします。 この操作により、メニューが不要になり、コピー/貼り付けシーケンスよりも高速になります。 必要な要件は 1 つだけです。ドロップ ソースとドロップ ターゲットの両方を開き、少なくとも部分的に画面に表示する必要があります。
OLE ドラッグ アンド ドロップを使用すると、ある場所から別の場所 (ドキュメント内、異なるドキュメント間、またはアプリケーション間) にデータを簡単に転送できます。 コンテナーまたはサーバー アプリケーションのいずれかに実装できます。 アプリケーションには、ドロップ ソース、ドロップ ターゲット、またはその両方を指定できます。 アプリケーションでドロップ ソースとドロップ ターゲットの両方のサポートが実装されている場合は、子ウィンドウ間または 1 つのウィンドウ内でドラッグ アンド ドロップできます。 この機能により、アプリケーションの使い方がはるかに簡単になります。
データ オブジェクトとデータ ソース (OLE) の記事では、アプリケーションでデータ転送を実装する方法について説明します。 MFC OLE サンプル OCLIENT と HIERSVR を調べることも役立ちます。
ドロップ ソースを実装する
アプリケーションでドラッグ アンド ドロップ操作にデータを提供するには、ドロップ ソースを実装します。 ドロップ ソースの基本的な実装は比較的簡単です。 最初の手順では、ドラッグ操作を開始するイベントを決定します。 推奨されるユーザー インターフェイス ガイドラインでは、選択したデータ内のポイントで WM_LBUTTONDOWN イベントが発生したときと同様に、ドラッグ操作の開始を定義します。 MFC OLE サンプル OCLIENT と HIERSVR は 、次のガイドラインに従います。
アプリケーションがコンテナーであり、選択したデータが COleClientItem
型のリンクオブジェクトまたは埋め込みオブジェクトである場合は、その DoDragDrop
メンバー関数を呼び出します。 それ以外の場合は、 COleDataSource
オブジェクトを構築し、選択範囲で初期化し、データ ソース オブジェクトの DoDragDrop
メンバー関数を呼び出します。 アプリケーションがサーバーの場合は、 COleServerItem::DoDragDrop
を使用します。 標準的なドラッグ アンド ドロップ動作のカスタマイズについては、「 ドラッグ アンド ドロップのカスタマイズ」セクションを参照してください。
DoDragDrop
がDROPEFFECT_MOVEを返す場合は、ソース ドキュメントからソース データを直ちに削除します。
DoDragDrop
からの他の戻り値は、ドロップ ソースに影響しません。
詳細については、「OLE データ オブジェクトとデータ ソース: 作成と破棄、OLE データ オブジェクトとデータ ソース: 操作」を参照してください。
ドロップ ターゲットを実装する
ドロップ ソースよりもドロップ ターゲットを実装するには少し多くの作業が必要ですが、比較的簡単です。
OLE ドロップ ターゲットを実装するには
まだ存在しない場合は、アプリケーションの
InitInstance
メンバー関数でAfxOleInit
の呼び出しを追加します。 OLE ライブラリを初期化するには、この呼び出しが必要です。ドロップ ターゲットにするアプリケーションの各ビューにメンバー変数を追加します。 このメンバー変数は、
COleDropTarget
型か、そこから派生したクラスである必要があります。WM_CREATE メッセージ (通常は
OnCreate
) を処理するビュー クラスの関数から、新しいメンバー変数のRegister
メンバー関数を呼び出します。Revoke
ビューが破棄されると、自動的に呼び出されます。次の関数をオーバーライドします。 アプリケーション全体で同じ動作が必要な場合は、ビュー クラスでこれらの関数をオーバーライドします。 分離されたケースで動作を変更する場合や、
CView
以外のウィンドウでのドロップを有効にする場合は、COleDropTarget
派生クラスでこれらの関数をオーバーライドします。オーバーライド 許可するには OnDragEnter
ウィンドウで発生する操作を削除します。 カーソルが最初にウィンドウに入ったときに呼び出されます。 OnDragLeave
ドラッグ操作が指定したウィンドウから離れるときの特別な動作。 OnDragOver
ウィンドウで発生する操作を削除します。 カーソルがウィンドウ全体にドラッグされているときに呼び出されます。 OnDrop
指定されたウィンドウにドロップされるデータの処理。 OnScrollBy
ターゲット ウィンドウでスクロールが必要な場合の特別な動作。
MAINVIEW を参照してください。これらの関数が連携する方法の例については、MFC OLE サンプル OCLIENT の一部である CPP ファイル。
詳細については、「OLE データ オブジェクトとデータ ソース: 作成と破棄、OLE データ オブジェクトとデータ ソース: 操作」を参照してください。
ドラッグ アンド ドロップをカスタマイズする
ドラッグ アンド ドロップ機能の既定の実装は、ほとんどのアプリケーションで十分です。 ただし、一部のアプリケーションでは、この標準動作を変更する必要があります。 このセクションでは、これらの既定値を変更するために必要な手順について説明します。 この手法を使用すると、複合ドキュメントをサポートしていないアプリケーションをドロップ ソースにできます。
標準の OLE ドラッグ アンド ドロップ動作をカスタマイズする場合、または OLE 以外のアプリケーションがある場合は、データを格納する COleDataSource
オブジェクトを作成する必要があります。 ユーザーがドラッグ アンド ドロップ操作を開始すると、ドラッグ アンド ドロップ操作をサポートする他のクラスからではなく、このオブジェクトから DoDragDrop
関数を呼び出す必要があります。
必要に応じて、 COleDropSource
オブジェクトを作成してドロップを制御し、変更する動作の種類に応じて一部の関数をオーバーライドできます。 このドロップ ソース オブジェクトは、これらの関数の既定の動作を変更するために COleDataSource::DoDragDrop
に渡されます。 これらの異なるオプションにより、アプリケーションでのドラッグ アンド ドロップ操作をサポートする方法の柔軟性が大幅に向上します。 データ ソースの詳細については、「 データ オブジェクトとデータ ソース (OLE)」を参照してください。
ドラッグ アンド ドロップ操作をカスタマイズするには、次の関数をオーバーライドできます。
オーバーライド | カスタマイズするには |
---|---|
OnBeginDrag |
DoDragDrop を呼び出した後のドラッグ操作の開始方法。 |
GiveFeedback |
さまざまなドロップ結果に対する、カーソルの外観などの視覚的なフィードバック。 |
QueryContinueDrag |
ドラッグ アンド ドロップ操作の終了。 この関数を使用すると、ドラッグ操作中に修飾子キーの状態を確認できます。 |
こちらも参照ください
OLE
OLE データ オブジェクトとデータ ソース
OLE データ オブジェクトとデータ ソース: 作成と破棄
OLE データ オブジェクトとデータ ソース: 操作
COleClientItem::D oDragDrop
COleDataSource クラス
COleDataSource::D oDragDrop
COleDropSource クラス
COleDropTarget クラス
CView::OnDragLeave