● ToolBox API徒然草(2005/09/20)

  このニュースは、MOSAの会員にのみ配布されているデベロッパー向けの
  デジタルマガジンMOSADeNのに掲載された記事です。ほぼ一ヶ月遅れで
  ここに掲載されて行きます

 〜 ドラッグ&ドロップの活用(その8) 〜


あ今回は、いよいよ「ドラッグ&ドロップの活用」の最終回です。Send処理のドラッグ中にテンポラリ表示される、グレイ枠と半透明画像の登録方法を解説します。ImageWellコントロールに表示されているPICT画像をドラッグ&ドロップし、別アプリケーションに受け渡す処理を想定して話を進めます。

前回紹介したstartMyDrag()ルーチンで、ドラッグ用のグレイ枠と半透明の画像を作成している箇所は以下の部分です。まず、createRegionMyDrag()ルーチンで、グレイ枠用のRegion(RgnHandle)を作成しています。このRegionは、TrackDrag()に引数として渡すことで、ドラッグが継続される間はマウスカーソルの動きに追随して表示されます。半透明の画像の方を作成しているのは、createImageMyDrag()ルーチンです。こちらの処理は、表示させたい画像のPixMapHandleをSetDragImage()に渡すことで実現します。ここでは、画像のPixMapHandleを得るために、同矩形サイズのGWorldを確保し使用します。ちなみに、半透明の画像表示はオプションですので、対応する画像が無いなのど理由で、そちらの表示は省くことも可能です。その場合には、createRegionMyDrag()だけを実行すればOKです。



Send処理が終了した時点で、2つのRegionと1つのGWorldは必要なくなりますので、それぞれ削除しておくことを忘れないでください。この処理を忘れていると、ドラッグ&ドロップを実行する度にメモリーリークが発生することになります。



以下が、グレイ枠表示用のRegionを作成しているcreateRegionMyDrag()ルーチンです。まずは、IsControlActive()により、対象となるImageWellコントロールがアクティブかどうかを確認しています。そして、GetControlBounds()でコントロールの矩形枠を得て、それをRectRgn()でRegionへと変換します。そこからまったく同じRegionを複製し、サイズを上下左右1ピクセルだけ小さくした後に、DiffRgn()により差分を抽出します。これでグレイ枠用のRegionが完成しました。この時に注意する点は、このRegionの座標はグローバル座標でなければいけないということです。そのため、LocalToGlobal()で左上原点をグローバル座標へと変換し、得られたX,Y座標値をOffsetRgn()に渡し、完成したRegionを平行移動させておきます。



次は、ドラッグ時に表示される半透明画像を登録するためのcreateImageMyDrag()ルーチンです。グレイ枠の時と同様に、最初に対象となるImageWellコントロールがアクティブかどうかを確認しています。続いて、コントロール枠の左上をドラッグの基点として、そのグローバル座標を得ておきます。getMyControlWellPict()ルーチンで、コントロールに表示されているPICT画像のPicHandleを得て、自作のfitRect()ルーチンによりコントロール枠内に収まるようにフレームを調整しておきます。その後、コントロール枠と同じサイズのGWorldを作成し、そこにPICT画像を描画します。最後に、GWorldに確保されているPixMapHandle、矩形枠用のRegion、そしてドラッグ開始の基準点などをSetDragImage()に渡して半透明画像の登録は終了します。画像の半透明度は、引数で渡すパラメータにより変更可能です(Drag.hを参照)。



以下は、ImageWellコントロールに表示されているPICT画像のPicHandleを抽出するために用意したgetMyControlWellPict()ルーチンです。表示画像のデータ内容(アイコンなどの場合もある)を抽出するには、ControlButtonContentInfo構造体に適切なパラメータをセットしてから、GetImageWellContentInfo()を実行します。



本サンプルアプリケーションでは、データブラウザに登録された画像ファイルをダブルクリックすることで、スクロールバー付きのウィンドウへ表示することが可能です。次回からは、画像表示用ウィンドウをどう実装するかについて解説していきたいと思います。


copyright 2005 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact us: koike@ottimo.co.jp