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

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

Thanks everyone - amazingly helpful and quick reponses!

crystal clear code - thanks Sean

The MVC analogy is very helpful. I think I have some old Apple SmallTalk
discs lying around!

Cheers
Chris


On 2 October 2014 12:44, Justin Zamora <justin at zamora.com> wrote:

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


-- 
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/2f3f2bb0/attachment.html>

Posted on the users mailing list.