4

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

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

我熟悉 Swing 和 Win32 等其他框架中的剪贴板 dnd。

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

有什么好的教程或示例代码可以参考吗?


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

因此,看起来 dnd 在 OSX 上的 Racket 中是不可能的,我将不得不使用 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 回答