今回はロールアウト上でのドラッグ&ドロップ受け取りについて。
MaxScriptのロールアウトは、残念ながらファイルのドラッグ&ドロップを受け取る機能がありません。代わりに.NETコントロールを作成し、そちらで発生したイベントで、ファイルのフルパスを取得する事ができます。
.NETの簡単な説明
.NETはWindowsアプリを開発する為に設計されたフレームワークです。基本的に、Windowsで使用する全てのコントロール(ラベル、ボタン、グリッドビュー等)を利用する事ができ、それ以外にもありとあらゆるWindows機能やユーティリティが含まれています。
本来はC#などで使われる事が多いのですが、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イベント内でラベルの初期設定をしています。特にAllowDropはtrueに設定しておかないと、ドロップイベントが発生しなくなってしまいます。その他プロパティ設定は必須では無いのですが、コントロールの見栄えを良くするために設定しています。 -
ラベルのDragEnterイベント
.NETでは通常、D&Dを受け取るために2段階の処理が必要になります。 その1つがDragEnterイベントで、ドラッグ中のマウスがコントロール上に入ったとき、コントロールがドロップを受け取り可能かをWindowsに通知する必要があります。受け取りできない場合は拒否する事も出来ます。
今回は、ドラッグ中のオブジェクトがファイルかをチェックし、そうであれば受け取るよう通知しています。ファイル以外では、ビットマップやテキストデータ等の受け取りも可能です。 -
ラベルのDragDropイベント
2段階目の処理で、ユーザーがコントロール上でドロップした時に発生します。
ここでは引数のDragEventArgsオブジェクトから、ドロップされたファイルリストを取得しています。DragEventArgsはDataプロパティを持っており、そのオブジェクトに対してgetData関数を呼び出すことで詳細なデータを取得できます。今回はファイルパスを取得するよう指定しています。
fileNamesは受け取った全てのファイルのフルパスです。
情報
その他、各クラス詳細は.NETのリファレンスを参照してください。
Label クラス
Color 構造体
ContentAlignment 列挙体
DataFormats クラス
DragDropEffects 列挙体
DragEventArgs クラス