我正在使用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的用户。
结束这个问题。
答案 0 :(得分:4)
据我所知,Racket gui库只通过accept-drop-files
接口的on-drop-file
和window<%>
方法处理“文件”的拖放,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。