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 <jus...@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...@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 <matth...@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
____________________ Racket Users list: http://lists.racket-lang.org/users