在画布元素上绘制

6
我尝试在画布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)

有人知道我在上面的代码中哪里出错了吗?
2个回答

7
问题在于,即使你可以在调用画布的on-paint方法之外绘制画布,效果是暂时的。任何需要窗口刷新的窗口活动(例如移动和调整大小)都可能擦除你的绘图。
因此:请在绘制回调函数内绘制所有内容。
#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)

请参阅画布类的文档获取更多信息。


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)

似乎您需要先显示框架,然后等待一段时间,让窗口准备就绪。

2
这似乎是解决方案,我现在可以看到一条线了。奇怪的是,在Racket文档中没有提到这一点。如果我在canvas%类的on-event回调中执行一些绘图操作,则在初始化后立即生效。 - user2295291
2
请查看有关canvas的文档<%>请参考我的答案中的链接。 - soegaard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接