今回は、前回のファイル複製処理の続きです。startMyDrag()ルーチンの中で登録しているsendDataMyDrag()ルーチンについて詳しく解説します。ドラッグアイテムとして追加されたPromiseHFSFlavor構造体やその他の情報は、このルーチンの中で解析されてファイル複製のために用いられます。
以下が、「ドラッグ&ドロップの活用(その4)」で解説したstartMyDrag()ルーチンです。ここで再掲載しておきます。実際にファイルの複製を行うsendDataMyDrag()ルーチンは、SetDragSendProc()でシステムに登録しておきます。これにより、sendDataMyDrag()は、ドラッグ開始時ではなくドラッグ終了時(ドロップ時)に、Drag Managerにより呼び出されます。最初に、startMyDrag()の処理内容について、もう少し追加の解説をしておきます。

GetDragAttributes()で得られたアトリビュート値を調べることで、自分自身のウィンドウ上へのドロップか、別アプリケーションのウィンドウ上へのドロップかを区別することができます。また、もしドラッグアイテムのドロップ先が「Dock」のゴミ箱の中であれば(Mac OS 9ならデスクトップ上のゴミ箱)、GetStandardDropLocation()により返されたStandardDropLocationがkDragStandardDropLocationTrashとなります。よって、もし必要であれば、ドロップしたデータ(ファイルやPICT画像)を削除する処理を追加しておくことも可能です。ここでは、自作のdeleteDataMyDrag()ルーチンがその役割を担っていますが、処理内容はケースバイケースですので、詳細な解説は省略しておきます。
以下が、ドロップ時にファイルの複製を行うsendDataMyDrag()ルーチンです。まずは、GetFlavorData()でドラッグアイテムとして、PromiseHFSFlavor構造体が送られて来ているかどうかを調べます。もし送られて来ていれば、同様にGetFlavorData()を使い、複製元ファイルのFSSpec構造体(タイプは'fsc ')と複製先ファイル名のパスカル文字列(タイプは'str ')を得ます。そして、getDropDirectory()ルーチンを使うことで、ドロップ先のフォルダ(ディレクトリ)のFSSpec構造体を得ます。

以下が、ドロップ先のフォルダ(ディレクトリ)のFSSpecを返すgetDropDirectory()ルーチンです。そのFSSpecをgetFolderFSSpec()ルーチンに渡すことで、そのフォルダ自身のDirIDを得て、そこに新規のファイル名を組み合わせることで、複製先ファイルの完全なFSSpec構造体を作成しています。それを自作のduplicateFile()ルーチンに渡して、ファイルの複製を実行します。

それでは、処理の最後のSetDragItemFlavorData()は、いったい何をしているのでしょうか?実はこの処理を追加することで、複製が完了したファイルのFSSpecをFinderに教えることができます。結果として、Finderは複製済みのファイルのアイコンをドロップした位置にちゃんと移動して表示してくれます。この処理を行わないと、複製されたファイルはウィンドウ上のドロップされた位置ではなく、ディフォルト位置に表示されてしまいます。sendDataMyDrag()の最後の1ラインを削除すると、ドロップ終了後のアイコン表示がどうなるのかを、ぜひ試してみてください。
次回は、いよいよ「ドラッグ&ドロップの活用」の最終回です。ドラッグを実行中にテンポラリ表示される半透明の画像の作成と登録方法を解説します。例えばQuickTime PlayerからMovieをドラッグすると、ドラッグ中に小ぶりの半透明画像が表示されますが、そうした画像の作り方を紹介します。
copyright 2005 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact us: koike@ottimo.co.jp