2009-06-24 5 views
4

呼び出された後、私はかなりしばらくの間、これで苦労してきたドラッグアンドドロップの実装を行いDoDragDrop関数メソッドが

私のアプリケーションはサーバー上にあるファイル名、移入リストビューが含まれています。

ドラッグアンドドロップ機能を実装しようとしています。そのため、ユーザーはアプリケーションから自分のローカルコンピュータにファイルをドラッグできます。

これを行うには、まずファイルを一時的な場所にダウンロードしてから、アプリケーションのDoDragDrop()メソッドを呼び出します。

問題は、のDoDragDropメソッドが呼び出された後にダウンロードプロセスを実行するだけです。です。

私は(... GiveFeedback、ItemDrag、など)のドロップメソッドをドラッグして関連するすべてのイベントを試みたが、何もDoDragDrop関数が

行われた後に発生、イベントですので、基本的に私は必要なもの

を働きません

任意のアイデア??

答えて

3

.NETでこれを行う方法はわかりませんが、通常のWin32プログラミングでは、IDataObjectインターフェイスを実装するオブジェクトでIAsyncOperationインターフェイスを実装することもできます。 IDropTargetはそのインタフェースを使用してバックグラウンドスレッドでドラッグアンドドロップを実行し、実際の転送中にソースとターゲットがブロックされないようにします。唯一の問題は、ソースではなくターゲットが、これを利用するかどうかを決定することです。

代わりに、IDataObjectがファイル名を提供し、IDropTargetがファイルを直接移動する「最適化された移動」転送を使用します。

MSDNには、Handling Shell Data Transfer Scenariosの詳細があります。

もちろん、ドラッグアンドドロップを開始する前にファイルをダウンロードする必要があります。ドラッグアンドドロップを実行してターゲットを特定し、その後ダウンロードを実行する方法はありません。ただし、IDataObjectの保持IDがCFSTR_FILEDESCRIPTORCFSTR_FILECONTENTSのエントリ(ここではShell Clipboard Formatsと記載)があります。CFSTR_FILEDESCRIPTORには、ListViewの作成に使用された情報から記入され、CFSTR_FILECONTENTSは実装中にダウンロードを実行するIStreamインターフェイスを使用します。その前にではなく実際のドロップ操作。少なくともその方法では、ターゲットが実際に望むファイルをダウンロードするだけで、残りのファイルはスキップできます。

IAsyncOperationと組み合わせて、あなたが探している最終的な効果が得られるかもしれません。

+0

素晴らしい、唯一の問題は、私はそれをC#に翻訳する手がかりがないということです。 スニペット(任意のプログラミング言語)を投稿できますが、翻訳しようとしますか? ありがとう – Nissim

+0

(C++)あなたはまた、この男が言ったことを行うことができ、ドロップが起こったときに、IStreamを返す前に、ステージングディレクトリにファイルをダウンロードして、ドロップ位置にコピーするIStreamを返します。 –

+0

Read()メソッドが初めて呼び出されたときにIStream実装が実際のダウンロードを開始し、利用可能になったときにデータを返すだけでは、それほど大きなメリットはありません。ステージング領域を使用すると、ターゲットがファイルを待つ時間を遅くするだけです。 –

0

DragDropイベントをチェックしましたか?これは、あなたのコントロールがうまく落とされたときに発生したイベントです。

更新:遅延レンダリングを使用してエクスプローラにファイルをdrad-n-dropする必要がある場合は、article(C#のネイティブシェルドラッグアンドドロップを実装)を読むことができます。この記事の情報とコードを使用すると、遅延レンダリングをサポートする独自のIDataObject実装を作成できます。

+1

いいえ、私は**私のコントロールからドラッグしているので使用できません – Nissim

+0

ドラッグアンドドロップ操作はアプリケーション内で実行されるか、別のアプリケーションにドラッグされますか? – arbiter

+0

私のアプリケーションから別のアプリケーション(Windowsエクスプローラ、この問題では) – Nissim

関連する問題