ドラッグ&ドロップについて

[戻る]
はさみ 2009/09/28(月) 14:16:55
VC6 MFCアプリ
アプリのリストからドラッグして、アプリ以外(デスクトップ・フォルダ等)にドロップした
情報はどう取得したら良いのでしょう?

ドラッグ開始処理は分かるのですが、
ドロップした際に、ドロップ先のパスがほしいのですが。。

よろしくおねがいします。

PATIO 2009/09/28(月) 15:54:37
通常、ドロップされた方で対処すると思いますけれど。

ドラッグ側のアプリではドロップされた先の処理までは
出来ないんじゃないかなぁ。

はさみ 2009/09/28(月) 16:16:41
早々にありがとうございます。

できませんか。。。
自アプリ側でツリーにZIPファイルを列挙しています。
そのツリーからアイテムがドラッグされ、アプリ以外(デスクトップ・フォルダ等)へドロップされた
際に選択されたZIPファイルの解凍処理を行いたいと考えているのですが。。。

ドラッグ途中で解凍を行うと、解凍が終わるまでドロップできなくなってしまうためです。

ドロップ先がエクスプローラではその処理はできませんか?
サイトにのっているサンプルはどれもアプリ側でドロップを受け取る処理
ばかりで途方にくれています。

bun 2009/09/28(月) 17:11:27
単なる思いつきで、確認もしてないですけど。。。
ドロップするものが常にファイルであるなら、以下の手順でどうでしょう?

1)ドラッグ開始時(WM_LBUTTONDOWN)にSetCapture()
2)ドラッグ終了時(WM_LBUTTONUP)にReleaseCapture()
3)カーソル下ウィンドウを取得(WindowFromPoint()関数)
4)そのまま解凍処理を行う
5)カーソル下ウィンドウにWM_DROPFILESメッセージを投げる

ITO 2009/09/28(月) 18:01:10
> ドラッグ途中で解凍を行うと、解凍が終わるまでドロップできなくなってしまうため
> です。
解凍をスレッドですればいいのでは?
解凍開始・終了のフラグを設けて、二回は解凍終了時に解凍するようにすればいいので
は?

はさみ 2009/09/28(月) 19:57:37
皆様ありがとうごさいます。

bunさん
さっそく試してみます。

ITOさん
>二回は解凍終了時に解凍するようにすればいいのでは?
すみません、経験が浅いため理解できませんでした。
どういう意味でしょうか?

Oleの遅延レンダリングってのが気になります。
これも情報が少ないですが、私がやろうとしていることとは関係ないのでしょうか?
この辺詳しい方いらっしゃいますか?

ITO 2009/09/28(月) 20:36:09
>すみません、経験が浅いため理解できませんでした。
>どういう意味でしょうか?
確かに文章がおかしいです。
 「スレッドなので、同時に2度、解凍処理を行なわないようにフラグで制御する。」
です。
これでどうでしょうか?
判り難くてすみませんです。

gak 2009/09/30(水) 17:13:24
どのような形でDrag&Dropを実装をしているのかが判らないが…とりあえずOLEに依る
Drag&Dropという前提時の回答。

OLE を利用した場合のDrag&Dropは以下のような流れになる。
1、::DoDragDrop(IDataObject, ...) でDrop処理開始
2、他アプリがDropされようとしているデータの情報を得るために IDataObject::QueryGe
   tData()が呼ばれる
3、他アプリの上でDropされると IDataObject::GetData() が呼ばれる

> そのツリーからアイテムがドラッグされ、アプリ以外(デスクトップ・フォルダ等)へド
> ロップされた際に選択されたZIPファイルの解凍処理を行いたいと考えているのですが
「2」時、他アプリは「お前がDropしようとしているのはどんな形式のデータだ?」と尋
ねる為に IDataObject::QueryGetData() を呼び出す。
この時、少し嘘を付いて「通常のファイル(パス)」をDropすると伝える。

「3」の段階で、他アプリは実際にDropされた実データを得るために IDataObject::GetDa
ta()を呼び出す。
この段階でzipを何処か「一時展開先のパス」に展開し、その「一時展開したファイルパ
ス」をDropされた実データとして渡してやる。

こうすればドロップされたその時にZIPファイルの解凍処理を行えそう。


一時展開したファイルの後始末が問題になるが、エクスプローラ等が相手ならば「ファイ
ルを移動」指定をしてやれば多分勝手に始末してくれる。
「ファイルを移動」指定については「CFSTR_PREFERREDDROPEFFECT」でググって辿って行
けば情報にありつける筈。

以下ページとか参考になりそう。関連ワードでググっても他の良いページが見つかる筈。
MFCだと、COleDropSource でググれば参考になる情報が多分出てくる。
http://hp.vector.co.jp/authors/VA016117/oledragdrop3.html
http://www.geocities.jp/fjtkt/problems/2006_0026.html

古いスレッドには追加発言できません。