Racket 如何接受放在球拍画布上的剪贴板数据
我正在使用Racket编写一个UI应用程序,希望能够从其他应用程序中拖放项目,例如图像。具体来说,我想从浏览器(如Chrome或FF)中的网页中拖动一幅图像,并将其放到应用程序中的Racket 如何接受放在球拍画布上的剪贴板数据,racket,Racket,我正在使用Racket编写一个UI应用程序,希望能够从其他应用程序中拖放项目,例如图像。具体来说,我想从浏览器(如Chrome或FF)中的网页中拖动一幅图像,并将其放到应用程序中的canvas%上,从而接收原始图像数据(应用程序将在接受丢弃的图像之前检查PNG元数据) 在canvas%类或超级类上没有直接与剪贴板事件相关的功能(我可以找到) 我熟悉其他框架(如Swing和Win32)中的剪贴板d-n-d 看起来需要的是clipboard%类,但是Racket文档很难将点连接到其中一个窗口类 有什
canvas%
上,从而接收原始图像数据(应用程序将在接受丢弃的图像之前检查PNG元数据)
在canvas%
类或超级类上没有直接与剪贴板事件相关的功能(我可以找到)
我熟悉其他框架(如Swing和Win32)中的剪贴板d-n-d
看起来需要的是clipboard%
类,但是Racket文档很难将点连接到其中一个窗口类
有什么好的教程或示例代码可以参考吗
更新:我查看了clipboard.rkt的Racket源代码(OSX),它似乎只访问“常规”粘贴板。OSX有一个单独的粘贴板用于拖放操作 因此,在OSX上的Racket中似乎不可能使用d-n-d,我将不得不使用Objective-C FFI来实现所需的功能,并将我的用户限制在那些使用Mac的用户
结束这个问题 据我所知,Racket gui库仅通过
canvas%
实现的window
界面的accept drop files
和on drop file
方法来处理“文件”的拖放。我不熟悉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)
我建议在网上询问