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