4

Racket を使用して UI アプリを作成しており、他のアプリケーションから画像などのアイテムをドラッグ アンド ドロップできるようにしたいと考えています。具体的には、ブラウザー (Chrome や FF など) の Web ページから画像をドラッグしcanvas%、アプリ内にドロップして、結果として生の画像データを受け取りたい (アプリは PNG メタデータを調べてから、ドロップした画像)。

canvas%クリップボードイベントに関連するクラスまたはスーパークラスに直接機能する (私が見つけることができる) ものはありません。

Swing や Win32 などの他のフレームワークのクリップボード dnd に精通しています。

クラスが必要なもののように見えますclipboard-client%が、Racket のドキュメントでは、ウィンドウ クラスの 1 つにアタッチすることに関して点を結び付けるのが難しくなっています。

参考になるチュートリアルやサンプル コードはありますか?


更新: clipboard.rkt の Racket ソース (OSX) を調べたところ、「一般的な」ペーストボードにしかアクセスできないようです。OSX には、ドラッグ アンド ドロップ操作用の別のペーストボードがあります。

そのため、OSX 上の Racket では dnd は使用できないようです。Objective-C FFI を使用して必要な機能を実装し、ユーザーを Mac を使用しているユーザーに制限する必要があります。

この質問を閉じます。

4

1 に答える 1

4

私の知る限り、Racket guiライブラリは、を実装するインターフェイスのメソッドaccept-drop-fileson-drop-fileメソッドを介して「ファイル」のドラッグアンドドロップのみを処理します。私はdndプロトコルに精通していませんが、少なくともLinuxでは、Firefoxからドラッグされた画像はファイルとしてカウントされないため、受け入れられませんが、nautilusからドラッグされたファイルは受け入れられます。window<%>canvas%

これが私がそれをテストするために使用した小さなプログラムです:

#lang racket/gui

(define my-canvas%
  (class canvas%
    (define/override (on-drop-file file)
      (printf "got file: ~s\n" file)
      (super on-drop-file file))
    (super-new)))

(define f (new frame% (width 400) (height 400) (label "frame")))
(define c (new my-canvas% (parent f)))
(send c accept-drop-files #t)
(send f show #t)

ラケットのメーリングリストで質問することをお勧めします。

于 2013-03-14T13:22:54.030 に答える