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

From: Chris Wright (cawright.99 at gmail.com)
Date: Wed Oct 1 22:16:00 EDT 2014

Thanks Matthias and Sean

It's often helpful when people asking questions ask them clearly ! :)
I'll now attempt a clarification...

say I have a button in the window, and when that button is pressed, I want
to draw on the canvas - and later, another button is pressed, and I might
want to draw something else somewhere else on the canvas.

I think I'm wanting to get hold of the dc outside of the definition of
on-paint in the initialisation code

cheers and thanks again

Chris

On 2 October 2014 11:57, Matthias Felleisen <matthias at ccs.neu.edu> wrote:

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


-- 
A/Prof Chris Wright
MBBS, FRACP, FCICM, GradDipiSc(Physics)
Academic Coordinator, Years III - V Central MBBS
Intensive Care Specialist
Faculty of Medicine, Nursing and Health Sciences,
Monash University
Clayton VIC
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20141002/b79d5197/attachment.html>

Posted on the users mailing list.