ロールアウト上でのドラッグ&ドロップ受け取り

投稿者: | 2016/02/17

今回はロールアウト上でのドラッグ&ドロップ受け取りについて。
外部から投げられたファイルドロップを受け取り、そのファイルのフルパスを受け取る方法です。

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

コピペして実行すると、以下の様なウィンドウが表示されます。

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

スクリプト説明

  1. コントロール作成
    ロールアウトの初期化で.NETラベルを作成しています。
    この時、ラベルがロールアウト全体を覆うようにサイズ調整しています。

  2. ロールアウト初期化イベント
    ロールアウトのopenイベント内で.NETラベルの設定をしています。
    特にAllowDropはtrueに設定しておかないと、ドロップイベントが発生しなくなってしまいます。

    その他プロパティは特に必要では無いのですが、コントロールの見栄えを良くするために設定しています。

  3. ラベルのDragEnterイベント
    .NETコントロールでは通常、D&Dを受け取るために2段階の処理が必要になります。
    その1つがDragEnterイベントで、ドラッグ中のマウスカーソルがコントロール上に入ったとき、このイベントが発生します。
    このイベント内では、侵入したマウスに対して、受け取りが可能かを通知する必要があります。

    今回は、ドラッグ中のオブジェクトがファイルかをチェックし、そうであれば受け取れるよう通知しています。ファイル以外では、ビットマップやテキストデータ等の受け取りも可能です。

  4. ラベルのDragDropイベント
    ユーザーが最終的にコントロール上でドロップした時に発生します。
    これが、2段階目の処理です。

    ここでは引数のDragEventArgsオブジェクトから、ドロップされたファイルリストを取得しています。
    DragEventArgsはDataプロパティを持っており、そのオブジェクトに対してgetData関数を呼び出すことで詳細なデータを取得できます。今回はファイルパスを取得するよう指定しています。

    fileNamesは受け取った全てのファイルのフルパスです。

情報

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

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

コメントを残す

メールアドレスが公開されることはありません。