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

From: Justin Zamora (justin at zamora.com)
Date: Wed Oct 1 22:44:16 EDT 2014

You should learn about Model-View-Controller architecture (for example at
http://en.m.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller).

Briefly, the model is a data structure that represents the information you
are working with. The view is able to produce a visual representation of
the model. A controller is used to update the model in response to input.

In your example, the canvas is the view. Your on-draw method needs to draw
the model. Your buttons will send a message to your controller, and the
controller will update the model accordingly. Then, when on-draw is called,
it will draw the updated model.

Justin
On Oct 1, 2014 10:17 PM, "Chris Wright" <cawright.99 at gmail.com> wrote:

> 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
>
> ____________________
>   Racket Users list:
>   http://lists.racket-lang.org/users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20141001/fc69d6b6/attachment.html>

Posted on the users mailing list.