As Alex writes the operating system (the system GUI) might erase parts of a window at any time. Therefore you need to do all your drawing from within on-paint.
http://stackoverflow.com/q/16084690/23567 /Jens Axel 2016-09-16 7:09 GMT+02:00 Alex Harsanyi <[email protected]>: > According to the documentation for the canvas<%> interface you cannot rely > on the canvas not being cleared (http://docs.racket-lang.org/ > gui/canvas___.html?q=canvas%3C%25%3E): > > Even when the canvas’s style suppresses explicit clearing of the canvas, a > canvas may be erased by the windowing system due to window-moving and > -resizing operations. For a transparent canvas, “erased” means that the > canvas’s parent window shows through. > > I suspect the window system clears the canvas when the frame is resized. > > Alex. > > > On Friday, September 16, 2016 at 9:06:01 AM UTC+8, David K. Storrs wrote: > > How do I draw into a canvas and have the results persist past the next > call to paint-callback? > > > > > > Given the code below I was expecting to see: > > > > 1) A window opens with a diagonal green line on it > > > > 2) A vertical blue line appears, crossing with the green line > > > > 3) The window goes fullscreen, still showing the green and blue lines > > > > > > > > Instead what I get is: > > > > 1) A window appears with vertical blue line > > > > 2) The blue line disappears and is replaced by a diagonal green line > > > > 3) The window goes fullscreen. Only the green line is shown. > > > > > > I'm guessing that what's happening is that the window opens, completes > going through the script (and therefore calling the section of code that > displays the blue line), then the on-paint event is triggered and erases > the canvas's dc before calling the paint callback. > > > > > > I tried removing the paint-callback on the theory that the default one > probably just told the dc to render its content. That made no change > except that (unsurprisingly) the green line is not painted -- the blue line > is, but promptly disappears. > > > > > > Assuming I'm right about what's going on, how do I draw into a dc and > have the changes persist? > > > > > > > > #lang racket > > (require racket/gui) > > > > > > (define-values (w h) (get-display-size)) > > (displayln (format "Display size (pixels): ~a x ~a" w h)) ;; 1440 x 877 > > (define frame (new frame% > > (label "Example") > > (width w) > > (height h) > > )) > > (define canvas > > (new canvas% > > (parent frame) > > (style '(border hscroll vscroll resize-corner)) > > (paint-callback (lambda (canvas dc) > > (send dc set-pen (send the-pen-list > find-or-create-pen "green" 1 'solid)) > > (send dc draw-line 0 0 1430 867) > > )))) > > > > (define dc (send canvas get-dc)) > > > > (send frame show #t) > > (send dc set-pen (send the-pen-list find-or-create-pen "blue" 1 'solid)) > > (send dc draw-line 700 0 700 877) > > (send frame fullscreen #t) > > -- > You received this message because you are subscribed to the Google Groups > "Racket Users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- -- Jens Axel Søgaard -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.

