MaxScriptのRolloutは、残念ながらファイルのドラッグ&ドロップがサポートされていません。
仕方がないので、代わりに.NETコントロールを作成し、.NET側で発生したイベントを受け取ってこの機能を実装します。
.NETでのドラッグ&ドロップ
.NETは本来Windowsアプリを開発する為に設計されたフレームワークなので、全ての種類のコントロールでドロップ受け取りが可能です。例えばラベル、ボタン、パネル系コントロールやリストボックス等でも受け取る事ができます。
今回はラベルを使用します。
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ラベルコントロールを作成しています。
この時、ラベルがRollout全体を覆うようにサイズ調整しています。
- ロールアウト初期化イベント
ロールアウトopenイベント内でラベルコントロールの設定をしています。
特にallowdropはtrueにしておかないとドロップイベントが発生しないので要注意です。
その他プロパティは特に必要では無いのですが、コントロールの見栄えを良くするために設定しています。
FromArgbの引数は、字のごとくAlpha, Red, Green, Blueの順です。
- ドラッグカーソル受け入れイベント
このハンドラは.NETコントロールのDragEnterイベントを受け取っています。
引数のsenderはイベントを発生させたコントロール(この場合はdotNetLabelのインスタンス)、argsはDragEventArgsクラスのインスタンスを格納しています。
DragEnterイベントは、ドラッグ中のカーソルがコントロール上に侵入した時に発生し、そのドラッグを受け入れ可能かをユーザーに示す為に使用します。
ここではドラッグのデータタイプをチェックし、ファイルであれば受け入れるように処理しています。
その他に、ビットマップやテキストデータ等の受け取りも可能です。
- ドロップイベント
ユーザーが最終的にドロップした時に発生します。
イベント引数はDragEnterと同じです。
ここではDragEventArgsからドロップされたファイルリストを取得し、fileNamesに格納しています。
fileNamesは受け取った全てのファイルのフルパスを含む配列です。
情報
その他、各クラス詳細は.NETのリファレンスを参照してください。Label クラス
Color 構造体
ContentAlignment 列挙体
DataFormats クラス
DragDropEffects 列挙体
DragEventArgs クラス