2013-04-18 4 views
5

У меня проблема при попытке нарисовать элемент GUI холста.Рисунок на холсте% element

Я создаю кадр, холст и пытаюсь нарисовать контекст постоянного текста с помощью метода draw-line, но ничего не происходит. Отображается рамка с холстом, но линия не отображается на холсте.

(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

Попробуйте это:

(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. Если я выполняю какой-либо рисунок в обратном вызове on-event класса 'canvas%', он работает сразу после intialising. – user2295291

+2

Смотрите документацию на холсте <%> см. Мой ответ на ссылку. – soegaard

5

Проблема в том, что даже если вы можете нарисовать на холсте за пределами вызов метода рисования на холсте, эффект является временным. Любое действие окна, которое требует обновления окна (например, перемещение и изменение размера), может потенциально удалить ваш чертеж.

Поэтому: нарисуйте все, что находится внутри обратного вызова 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) 

Для получения дополнительной информации см. Documentation on the canvas class.