LISPの画面再描写に関する記述

 どの言語でも同じですが、GUIのプログラムでは、ウインドウ内に描写した情報は保存されていません。そのため最小化やウインドウの移動などで、プログラムのウインドウが一度見えなくなると次に現れたときに前の情報が消え、結果として白紙になってしまいます。どこに何を描写したかというデータは残らないので、OSがそのウインドウを再現できないのです。
 しかしOSは再描写が必要なときウインドウに再描写メッセージ(LISPでは「:redraw」)を送ります。そこで、このときに描写するデータを記述しておけばいいわけです。
 つまり、

(ウインドウの設定)
(defmeth w redraw ()
 (描写)
)

 とすれば w に再描写が発生したときに(描写)を繰り返すことになります。  何も設定しなかった場合は、(描写)部分が設定されていないためウインドウを触った途端に白紙になったわけです。(タイミングはOSによる)
 以下はコードの例です。

(defun window (w onDraw &optional (x 250) (y 250))
  (send w :use-color t)
  (send w :size x y)
  (send w :draw-color 'RED)
  (defmeth w :redraw ()
    (let ((width (send w :canvas-width))
      (height (send w :canvas-height)))
      (send w :start-buffering)
;      (send w :erase-window)
      (funcall onDraw width height)
      (send w :buffer-to-screen)
    )
  )
)

(defun f (width height)
  (send w :draw-line 0 0 width height)
)
(defun g (width height)
  (send w :paint-oval 0 0 width height)
)

;(setf w (send graph-window-proto :new))
;as you choose
;(window w #'f)
;(window w #'g)



戻る戻る Produce:Teranishi