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

投稿者: | 2016/02/17

今回はロールアウト上でのドラッグ&ドロップ受け取りについて。

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

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

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

スクリプト説明

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

  2. ロールアウト初期化イベント
    ロールアウトのopenイベント内でラベルの初期設定をしています。特にAllowDropはtrueに設定しておかないと、ドロップイベントが発生しなくなってしまいます。その他プロパティ設定は必須では無いのですが、コントロールの見栄えを良くするために設定しています。

  3. ラベルのDragEnterイベント
    .NETでは通常、D&Dを受け取るために2段階の処理が必要になります。 その1つがDragEnterイベントで、ドラッグ中のマウスがコントロール上に入ったとき、コントロールがドロップを受け取り可能かをWindowsに通知する必要があります。受け取りできない場合は拒否する事も出来ます。
    今回は、ドラッグ中のオブジェクトがファイルかをチェックし、そうであれば受け取るよう通知しています。ファイル以外では、ビットマップやテキストデータ等の受け取りも可能です。

  4. ラベルのDragDropイベント
    2段階目の処理で、ユーザーがコントロール上でドロップした時に発生します。
    ここでは引数のDragEventArgsオブジェクトから、ドロップされたファイルリストを取得しています。DragEventArgsはDataプロパティを持っており、そのオブジェクトに対してgetData関数を呼び出すことで詳細なデータを取得できます。今回はファイルパスを取得するよう指定しています。
    fileNamesは受け取った全てのファイルのフルパスです。

情報

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

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

コメントを残す

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