今回はロールアウト上でのドラッグ&ドロップ受け取りについて。
外部から投げられたファイルドロップを受け取り、そのファイルのフルパスを受け取る方法です。
MaxScriptのロールアウトは、残念ながらファイルのドラッグ&ドロップをサポートしていません。
代わりに.NETコントロールを作成し、そちらで発生したイベントを受け取る事ができます。
.NETでのドラッグ&ドロップ
.NETは本来Windowsアプリを開発する為に設計されたフレームワークという事もあり、基本的に全てのコントロール(ラベル、ボタン等)を利用する事ができます。
また、それらのコントロールのほぼ全てでドロップ受け取りが可能です。
MaxScript側からもそれらのコントロールを作成し、ロールアウトに配置する事が可能ですが、今回はシンプルにラベルを使用して作成したいと思います。
以下のようなロールアウトを作成します。
rollout rltDropTest "DropDialog" width:160 height:72
(
-- 1. コントロール作成
dotNetControl dotNetLabel "label" pos:[0,0] width:160 height:72
-- 2. ロールアウト初期化イベント
on rltDropTest open do
(
local Color = dotnetclass "System.Drawing.Color"
local Alignment = dotNetClass "System.Drawing.ContentAlignment"
dotNetLabel.allowdrop = true
dotNetLabel.text = "Drop files here."
dotNetLabel.backcolor = Color.FromArgb 255 64 64 64
dotNetLabel.forecolor = Color.white
dotNetLabel.textAlign = Alignment.MiddleCenter
)
-- 3. ドラッグカーソル侵入イベント
on dotNetLabel DragEnter sender args do
(
local Formats = dotnetclass "DataFormats"
local Effects = dotnetclass "DragDropEffects"
if args.Data.GetDataPresent Formats.FileDrop then
args.Effect = Effects.Copy
else
args.Effect = Effects.None
)
-- 4. ドロップイベント
on dotNetLabel DragDrop sender args do
(
local Formats = dotnetclass "DataFormats"
local fileNames = args.Data.GetData Formats.FileDrop false
print fileNames
)
)
createDialog rltDropTest
コピペして実行すると、以下の様なウィンドウが表示されます。

このウィンドウにファイルをドロップすると、そのファイルパスがリスナーに出力されます。
スクリプト説明
- コントロール作成
ロールアウトの初期化で.NETラベルを作成しています。
この時、ラベルがロールアウト全体を覆うようにサイズ調整しています。 - ロールアウト初期化イベント
ロールアウトのopenイベント内で.NETラベルの設定をしています。
特にAllowDropはtrueに設定しておかないと、ドロップイベントが発生しなくなってしまいます。その他プロパティは特に必要では無いのですが、コントロールの見栄えを良くするために設定しています。
-
ラベルのDragEnterイベント
.NETコントロールでは通常、D&Dを受け取るために2段階の処理が必要になります。
その1つがDragEnterイベントで、ドラッグ中のマウスカーソルがコントロール上に入ったとき、このイベントが発生します。
このイベント内では、侵入したマウスに対して、受け取りが可能かを通知する必要があります。今回は、ドラッグ中のオブジェクトがファイルかをチェックし、そうであれば受け取れるよう通知しています。ファイル以外では、ビットマップやテキストデータ等の受け取りも可能です。
-
ラベルのDragDropイベント
ユーザーが最終的にコントロール上でドロップした時に発生します。
これが、2段階目の処理です。ここでは引数のDragEventArgsオブジェクトから、ドロップされたファイルリストを取得しています。
DragEventArgsはDataプロパティを持っており、そのオブジェクトに対してgetData関数を呼び出すことで詳細なデータを取得できます。今回はファイルパスを取得するよう指定しています。fileNamesは受け取った全てのファイルのフルパスです。
情報
その他、各クラス詳細は.NETのリファレンスを参照してください。
Label クラス
Color 構造体
ContentAlignment 列挙体
DataFormats クラス
DragDropEffects 列挙体
DragEventArgs クラス