MaxScriptTip: Rolloutでのドラッグ&ドロップの受け取りについて

2月 17, 2016
今回はRollout内での外部からのドラッグ&ドロップ受け取りについて。

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

実行すると以下の様なウィンドウが表示されます。
このウィンドウにファイルをドロップすると、そのファイルパスがリスナーに出力されます。

スクリプト説明

  1. コントロール作成
    .NETラベルコントロールを作成しています。
    この時、ラベルがRollout全体を覆うようにサイズ調整しています。
  2. ロールアウト初期化イベント
    ロールアウトopenイベント内でラベルコントロールの設定をしています。
    特にallowdropはtrueにしておかないとドロップイベントが発生しないので要注意です。
    その他プロパティは特に必要では無いのですが、コントロールの見栄えを良くするために設定しています。
    FromArgbの引数は、字のごとくAlpha, Red, Green, Blueの順です。
  3. ドラッグカーソル受け入れイベント
    このハンドラは.NETコントロールのDragEnterイベントを受け取っています。
    引数のsenderはイベントを発生させたコントロール(この場合はdotNetLabelのインスタンス)、argsはDragEventArgsクラスのインスタンスを格納しています。
    DragEnterイベントは、ドラッグ中のカーソルがコントロール上に侵入した時に発生し、そのドラッグを受け入れ可能かをユーザーに示す為に使用します。
    ここではドラッグのデータタイプをチェックし、ファイルであれば受け入れるように処理しています。
    その他に、ビットマップやテキストデータ等の受け取りも可能です。
  4. ドロップイベント
    ユーザーが最終的にドロップした時に発生します。
    イベント引数はDragEnterと同じです。
    ここではDragEventArgsからドロップされたファイルリストを取得し、fileNamesに格納しています。
    fileNamesは受け取った全てのファイルのフルパスを含む配列です。

情報

その他、各クラス詳細は.NETのリファレンスを参照してください。

Label クラス
Color 構造体
ContentAlignment 列挙体
DataFormats クラス
DragDropEffects 列挙体
DragEventArgs クラス

おまけ

.msファイル暗号化ツール作ってみました。

TR_EncryptScript.ms ver1.00

Related Articles