今回からは、前回紹介したドラッグ&ドロップにおけるSend処理の手順を追って行きます。まずは、startMyDrag()内で実行されているcreateDataMyDrag()ルーチンの紹介です。ドラッグ&ドロップで受け渡すデータの種類が変わることで、そのデータを登録する処理がどのようになるかを調べてみます。
Drag Managerでは、Send処理で受け渡すデータを「ドラッグアイテム」と呼びます。ドラッグアイテムのうち幾つかの種類については、アプリケーション同士が暗黙のうちに認識できるように、種類やその内容がOS標準として定義されています。例えば、Mac OS 9時代に頻繁に利用していたスクラップブックに保存されていた画像やテキストデータなどがそうです。まず最初に、クリップボードに保存されているPICT画像を、ワープロやペイントアプリケーションへ渡す場合のドラッグアイテムの作り方を取り上げてみます。以下のgetClipbord()は、クリップボードから任意のデータを取り出す簡単なルーチンです。

Send処理で好みのデータを受け渡したい場合には、AddDragItemFlavor()を利用して現在のDragReferenceへ新規ドラッグアイテムを追加します。以下のcreateDataMyDrag()ルーチンでは、クリップボードから抽出したPICT画像(PicHandle)を、AddDragItemFlavor()でドラッグアイテムとして登録しています。このドラッグアイテムをデスクトップへドロップすると、Finderによりクリッピングファイル(Mac OS Xであればピクチャクリッピング)が作成されることになります。ここで注意することは、AddDragItemFlavor()で渡したデータはシステム内部で複製されますので、渡した後のオリジナルの方は削除(不必要であれば)している点です。そうしないと、ドラッグ&ドロップするたびに不必要なメモリ領域が消費されていくことになります。

getClipbord()に渡すデータタイプを'PICT'から'TEXT'へ変更すれば、クリップボードに保存されている文字列データを別アプリケーションへ渡すことが可能になります。

次は、ImageWellコントロールに表示されているPICT画像をドラッグアイテムに加えてみましょう。ImageWellコントロールは、PICT画像だけでなくアイコンなども表示することが可能です、表示されているデータは、ControlButtonContentInfo構造体に適切な情報を代入してGetImageWellContentInfo()に渡すことで得ることができます。contentTypeメンバーに画像の種類をセットすれば、そのデータへの参照パラメータ(リファレンス)については、次に続くUnion構造体のメンバーに代入されて返ります。

今回欲しいのは表示されているPICT画像のPicHandleですので、info.contentTypeにはkControlContentPictHandleをセットします。もし、ImageWellコントロールにPICT画像が表示されていれば、info.u.pictureにその画像のPicHandleが返されます。クリップボードの時と同様に、これもオリジナルの複製となりますので注意してください。

以下のcreateDataMyDrag()ルーチンでは、ImageWellコントロールに表示されているPICT画像をドラッグアイテムに加えています。どのコントロールなのかは、引数で渡されてくるControlRefで判断するのですが、それ以外の処理内容は、クリップボード経由の場合とほとんど同じとなります。

次回は、ファイル情報をアプリケーションからFinderにドラッグ&ドロップしたい時のドラッグアイテムの追加方法を紹介します。具体的には、ドラッグアイテムとして渡すことになる、HFSFlavor構造体とPromiseHFSFlavor構造体の「使い分け」を解説します。
copyright 2005 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact us: koike@ottimo.co.jp