绘制到canvas%元素

use*_*291 5 scheme drawing canvas racket

我在尝试绘制画布GUI元素时遇到问题.

我创建了一个框架,一个画布,并尝试使用该draw-line方法绘制画布的dc上下文,但没有任何反应.显示了带有画布的框架,但画布上未显示该线条.

(require racket/gui/base)

(define frame (new frame% [label "Frame"] [width 500] [height 500]))
(define canvas (new canvas% [parent frame]))
(define dc (send canvas get-dc))

(send dc draw-line 10 10 200 200)
(send frame show #t)
Run Code Online (Sandbox Code Playgroud)

有没有人知道上面的代码我错在哪里?

soe*_*ard 5

问题是,即使你可以在画布的on-paint方法调用之外绘制画布,效果也是暂时的.任何需要刷新窗口(例如移动和调整大小)的窗口活动都可能会擦除您的绘图.

因此:从paint-callback中绘制所有内容.

#lang racket
(require racket/gui/base)

(define frame (new frame% [label "Frame"] [width 500] [height 500]))
(define canvas (new canvas% 
                    [parent frame]
                    [paint-callback 
                     (?(can dc) (send dc draw-line 10 10 200 200))]))
(define dc (send canvas get-dc))
(send frame show #t)
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅canvas类上的文档.


Ósc*_*pez 1

尝试这个:

(require racket/gui/base)

(define frame (new frame% [label "Frame"] [width 500] [height 500]))
(define canvas (new canvas% [parent frame]))
(define dc (send canvas get-dc))

(send frame show #t)
(sleep/yield 1)
(send dc draw-line 10 10 200 200)
Run Code Online (Sandbox Code Playgroud)

看来您需要先显示框架,然后稍等一下,让窗口准备好。

  • 这似乎是解决方案,我现在可以看到一条线。奇怪的是 Racket 文档中没有提到这一点。如果我在“canvas%”类的事件回调中执行一些绘图,它会在初始化后立即工作。 (2认同)
  • 请参阅 canvas<%> 上的文档,查看我的答案以获取链接。 (2认同)