如何接受放置在Racket画布上的剪贴板数据

时间:2013-03-13 22:21:07

标签: racket

我正在使用Racket编写UI应用程序,并希望能够从其他应用程序中拖放项目,例如图像。具体来说,我想从浏览器(例如Chrome或FF)中的网页拖动图像并将其放到应用程序中的canvas%,然后接收原始图像数据(应用程序将检查接受删除图像之前的PNG元数据。)

直接在与剪贴板事件相关的canvas%类或超类上没有任何功能(我可以找到)。

我熟悉其他框架中的剪贴板d-n-d,例如Swing和Win32。

看起来clipboard-client%类是必需的,但是Racket文档很难将点连接到其中一个窗口类中。

我可以参考哪些好的教程或示例代码?


更新:我查看了clipboard.rkt的Racket源(OSX),它似乎只能访问“常规”粘贴板。 OSX有一个单独的粘贴板用于拖放操作。

因此,看起来在OSX上的Racket中无法使用d-n-d,我将不得不使用Objective-C FFI来实现所需的功能,并将我的用户限制为使用Mac的用户。

结束这个问题。

1 个答案:

答案 0 :(得分:4)

据我所知,Racket gui库只通过accept-drop-files接口的on-drop-filewindow<%>方法处理“文件”的拖放,canvas%接口{ {1}}实现。我不熟悉dnd协议,但至少在Linux上,从Firefox中拖出的图像不算作文件,因此不接受它们,而从nautilus拖出的文件是。

这是我用来测试它的小程序:

#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)

我建议询问Racket mailing list