2013-04-18 18 views
5

Mam problem podczas próby narysowania na element GUI canvas.Rysowanie na płótnie% element

Tworzę ramkę, płótno i próbuję narysować kontekst dc płótna metodą draw-line, ale nic się nie dzieje. Ramka z płótnem jest pokazana, ale linia nie jest pokazana na płótnie.

(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) 

Czy ktoś wie, gdzie się mylę w powyższym kodzie?

Odpowiedz

2

Spróbuj tego:

(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) 

Wydaje się, że trzeba pokazać ramkę, a następnie trochę poczekać aby okno się przygotować.

+2

To wydaje się być rozwiązaniem, widzę teraz linię. Dziwne, że nie jest to wspomniane w dokumentacji Racket. Jeśli wykonuję rysunek w wywołaniu na zdarzenie klasy 'canvas%', działa on natychmiast po zainicjowaniu. – user2295291

+2

Zobacz dokumentację na płótnie <%> zobacz moją odpowiedź na link. – soegaard

5

Problem polega na tym, że chociaż można narysować na kanwie pod numerem wywołanie metody malowania na płótnie, efekt jest tymczasowy. Każde działanie okna wymagające odświeżenia okna (takie jak przenoszenie i zmiana rozmiaru) może potencjalnie wymazać rysunek.

Dlatego: Rysuj wszystko od wewnątrz wywołania funkcji malowania.

#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) 

Zobacz Documentation on the canvas class uzyskania dalszych informacji.