最終更新 2003 09/16
サンプルのダウンロード → API_DragAndDrop.lzh(38k)
全ソースコード
DragAcceptFiles 関数
DragQueryFile 関数
DragFinish 関数
対応しているバージョン
95, 98, Me, NT4.0以降, CE1.0以降, 2000, XP
使用するヘッダとライブラリ
shellapi.h
shell32.lib
|
実行中のウィンドウにドラッグ&ドロップされたファイルを調べるには
次の3ステップが必要です。
1.ウィンドウが作成された時に DragAcceptFiles() 関数で
ドラッグ&ドロップができるようにする。
2.WM_DROPFILES メッセージで DragQueryFile() 関数から
ドロップされたファイルを調べる。
3.DragFinish() 関数でドラッグ&ドロップに使われたメモリを解放。
まず、1.の場合ですが WM_CREATE メッセージが呼ばれた時に処理するのが
一般的なやり方のようです。
DragAcceptFiles() 関数の2番目の引数に TRUE を指定すると
ドラッグ&ドロップができるようになります。
FALSE を指定するとドラッグ&ドロップができなくなります。
DrawgAcceptFiles( hWnd, TRUEかFALSE );
FALSE の時にファイルをウィンドウにドロップしようとすると
マウスカーソルがドロップ禁止マークになって拒否されます。
最初はドラッグ&ドロップができないようになっています。
ファイルがドロップされると WM_DROPFILES メッセージが呼ばれます。
ここでドロップされたファイル名を調べて、適切な処理をします。
最初にファイルがいくつドロップされたかを DragQueryFile() 関数で調べます。
2番目の引数に 0xffffffff を指定すると、DragQueryFile() 関数は
ドロップされたファイル数を返してくれます。
1番目の引数には wParam を HDROP 型に型キャストして指定します。
他の引数は NULL で大丈夫です。
DragQueryFile( (HDROP)wParam, 0xffffffff, NULL, NULL );
ドロップされたファイル数が分かったら for でファイル数分ループして
ドロップされたファイル名を調べます。
この部分だけ簡単に書くと
こんな感じになります。
一通り処理が終わったら、最後に DragFinish() 関数を使って
ウィンドウズがドラッグ&ドロップ用に確保したメモリを解放します。
これを行わない場合は、ドロップされたファイル名がずっとメモリに
残ることになります。(多分、アプリケーションが終了するまで)
ドロップされたファイル名さえ取得できてしまえば、メモリに残っている
データは必要ありません。
さっさと解放して空きメモリを増やしましょう。
サンプルは何だかややこしくなってしまったので、WM_DROPFILES メッセージの
中だけで、ドロップされたファイルを調べて、取得できたファイル名を
メッセージボックスで表示するサンプルを以下に書いておきます。
実際はこんなに単純なことなのですが、受け取ったファイル名を変数に保存して
返すような関数を作ると、サンプルのように複雑になってしまいます・・・。
|