[racket] A beginner's question re drawing on a canvas

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Wed Oct 1 21:57:40 EDT 2014

Does this help? 

#lang racket/gui

(define frame
  (new frame%
       [label "Example"]
       [width 300]
       [height 300]))

(define top-canvas
  (new (class canvas%
         (inherit get-dc)
         (super-new [parent frame])
         (define/override (on-paint)
           (define dc (get-dc))
           (send dc draw-rectangle
                 0  10   ; Top-left at (0, 10), 10 pixels down from top-left
                 30 10) ; 30 pixels wide and 10 pixels high
           (send dc draw-line
                 0 0    ; Start at (0, 0), the top-left corner
                 30 30) ; and draw to (30, 30), the bottom-right corner
           (send dc draw-line
                 0 30   ; Start at (0, 30), the bottom-left corner
                 30 0)  ; and draw to (30, 0), the top-right corner
           ))))

(send frame show #t)




On Oct 1, 2014, at 9:51 PM, Chris Wright wrote:

> I would like to draw on a canvas in a window at various times during program execution. 
> My first attempt was to combine two examples:
> 
> #lang racket/gui
> 
> (define frame (new frame%
>                    [label "Example"]
>                    [width 300]
>                    [height 300]))
> (define top-canvas (new canvas% [parent frame]))
> 
> (send frame show #t)
> 
> (define dc (send top-canvas get-dc))
> 
> (send dc draw-rectangle
>       0  10   ; Top-left at (0, 10), 10 pixels down from top-left
>       30 10) ; 30 pixels wide and 10 pixels high
> (send dc draw-line
>       0 0    ; Start at (0, 0), the top-left corner
>       30 30) ; and draw to (30, 30), the bottom-right corner
> (send dc draw-line
>       0 30   ; Start at (0, 30), the bottom-left corner
>       30 0)  ; and draw to (30, 0), the top-right corner
> 
>                       
> 
> The cross and box are drawn, but "instantly" over-written by a blank canvas. I suppose this is because on-paint is triggered? (not sure by what..)
> If I put the (send frame...) form at the end of the code, the cross and box aren't seen.
> 
> I am sure this is due to me not understanding the model properly - I'd be grateful for some help...
> 
> many thanks
> 
> Chris
> ____________________
>  Racket Users list:
>  http://lists.racket-lang.org/users



Posted on the users mailing list.