[racket] A beginner's question re drawing on a canvas
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>