2009-06-03 1 views
0

ドラッグが完了するまでブロックせずにC++ Win32アプリケーションからOLEファイルのドラッグを開始する方法があるかどうかは知っていますか?非同期OLEドラッグ&ドロップが可能ですか?

ドラッグ操作を開始するのに現在DoDragDrop()を使用していますが、ドラッグ操作が完了するまでこの関数は戻りません。 これは、ドラッグが進行中のときにプログラム内のアニメーションが停止するという問題があります。

新しいスレッドからこのコマンドを起動しようとしましたが、このスレッドでOleInitialize()を呼び出しても機能しませんでした。

これに関連することがわかったのは、あとで(ファイル/データのコピー/移動など)非同期でデータ操作を行うことでした。私のアプリケーションでは、&のドラッグはそのような操作には使用されないため、問題ではなく、主な問題はユーザーがドラッグを実行している間のブロックです。 編集:これについてもっと明確にするために、DataObjectのIAsyncOperationは、データが非同期にドロップされた後にのみ操作を実行するため、この問題の解決策ではありません。 私が持っている問題は、ユーザーがマウスボタンを離す瞬間までドラッグを開始するポイントからのブロック動作です。

2つの解決策が考えられますが、これを達成するためのより簡単な方法があることを願っています。

  1. 私自身の(non-ole)ドラッグ&ドロップを実装します。これはもっとうまくいくはずですが、実際には自分のプログラム内から他のプログラムにファイルをドラッグすることが可能であるという素晴らしい機能が見つかりました。

  2. 新しいプロセスを作成/起動し、そこからドラッグ操作を開始します。アプリケーション内のWindowsエクスプローラからファイルをドラッグしても問題はないので、これはうまくいくと思います。 ドラッグはすぐに開始するはずです。新しいプロセスを作成するのに目立つ時間があるかどうかはわかりません。

答えて

0

私はこの問題に遭遇しました。私は新しいスレッドをスピンアップし、これを行うでしょう。 CreateProcessは時間がかかりますが、多分そうではありません。スレッドやプロセスを常に作成しておき、DoDragDrop()を呼び出す前にブロックするように同期してから、メインアプリケーションからブロックを解除することができます。

2

IDataObjectがIAsyncOperationインターフェイスをサポートしている場合、IDropTargetはIDropTarget :: Drop()をすばやく終了させ、実際の転送を非同期に実行するオプションを持ちます。ただし、IDropTargetはIAsyncOperationをサポートする必要はありません。

この現象は、MSDN's documentationに記載されています。また、DoDragDrop()は、ユーザがマウスを離してどちらかの方法でドロップを開始し、DoDragDrop()を呼び出すスレッドがマウスをドラッグしている間もブロックされるまで終了しません。

1

レミーの答えは正しいです。 IDataObjectの実装については、The Old New Thingからの一連のブログ記事もあります。 IAsyncOperationには入っていませんが、これが始まりです。

2

アニメーションを別のスレッドで実行します。

関連する問題