[Openmcl-devel] Displaying subviews under MS-Windows

Greg Bennett gwbennett at sentex.ca
Tue Jul 26 20:02:40 UTC 2011

Good morning from Greg Bennett
I am trying to understand the relationship between the handling of 
subviews and
the display of their host windows/views under MS-Windows.

What follows is a blow-by-blow account of my attempts to follow two of 
the supplied examples,
which I realise are directed to those using Mac OS rather than Windows.

If I this is not the right place for such posts, or if I have been too 
verbose, please let me know.
Perhaps there is documentation about what I observe. If so, I should be 
delighted to receive a
pointer to it.

I have used ;-> to show lines returned by CCL

Thanks for any and all advice and comment
Cheers /Greg Bennett

;; In Clozure CL Version 1.7-dev-r14869  (WindowsX8632)!
;; Running under Windows7 Pro 64bit
;; Using 32bit executables and listener

;; Initially, code from ccl/examples/cocoa/ui-elements//HOWTO.html
(in-package :ccl)
;->#<Package "CCL">

;; First sequence
;; (a) allocate my-window1
;; (b) equip it with attributes
;; (c) show it
;; (d) allocate my-button
;; (e) equip it too
;; (f) add my-button as a subview to my-window1
;; (g) add a label to my-button

(setf my-window1 (#/alloc (@class ns-window)))
;->#<NS-WINDOW [uninitialized] (#x3591640)>
(ns:with-ns-rect (r 100 100 400 300)
    (logior  #$NSTitledWindowMask
;->;Compiler warnings :
;->;   In an anonymous lambda form at position 93: Undeclared free 
variable MY-WINDOW1
;->#<NS-WINDOW <NSWindow 0x03591640> (#x3591640)>
(#/makeKeyAndOrderFront: my-window1 nil)

;;; .. and there is the window

(setf my-button (#/alloc ns:ns-button))
;->#<NS-BUTTON [uninitialized] (#x36981D0)>
(ns:with-ns-rect (frame 10 10 72 32)
   (#/initWithFrame: my-button frame)
   (#/setButtonType: my-button #$NSMomentaryPushInButton)
   (#/setImagePosition: my-button #$NSNoImage)
   (#/setBezelStyle: my-button #$NSRoundedBezelStyle))
;->;Compiler warnings :
;->;   In an anonymous lambda form at position 183: Undeclared free 
variable MY-BUTTON (4 references)
(#/addSubview: (#/contentView my-window1) my-button)

;;; and my-window1 is unchanged in appearance

;;; Check on the subviews of my-window1

(#/subviews (#/contentView my-window1))
;-> "<NSButton[0x36981d0] frame: {{10, 10}, {72, 32}}>"
;-> ) (#x35F19E8)>

;;; so the data structure behind my-window1 seems to know about the button

(let ((label (%make-nsstring "Hello!")))
   (#/setTitle: my-button label)
   (#/release label))
;->;Compiler warnings :
;->;   In an anonymous lambda form at position 57: Undeclared free 
variable MY-BUTTON

;;; nothing shows in my-window1

;; Second sequence with my-window2 for my-window1
;; switching adding the subview and showing the window
;; (a) allocate my-window2
;; (b) equip it with attributes
;; (f) add my-button as a subview to my-window2
;; (c) show my-window2

(setf my-window2 (#/alloc (@class ns-window)))
;->#<NS-WINDOW [uninitialized] (#x35D8C50)>
(ns:with-ns-rect (r 100 100 400 300)
    (logior  #$NSTitledWindowMask
;->;Compiler warnings :
;->;   In an anonymous lambda form at position 93: Undeclared free 
variable MY-WINDOW2
;->#<NS-WINDOW <NSWindow 0x035d8c50> (#x35D8C50)>
(#/addSubview: (#/contentView my-window2) my-button)
(#/makeKeyAndOrderFront: my-window2 nil)

;;; There is my-window2 complete with button which shows Hello!
;;; Hence the label was indeed added to the button under
;;; the First sequence.

::: It seems that I can assemble a composite view and then successfully 
;;; the whole thing, but not display part of it and then add the rest. 
But what
;;; follows has me wondering about such a simple dichotomy ..

;;; Third sequence
;;; Now some code from http://trac.clozure.com/ccl/wiki/CocoaBridge
;;; but operating in the :ccl package still
(defclass red-view (ns:ns-view)
   (:metaclass ns:+ns-object))
(objc:defmethod (#/drawRect: :void) ((self red-view) (rect :<NSR>ect))
   (#/set (#/redColor ns:ns-color))
   (#_NSRectFill (#/bounds self)))
;->|-[RedView drawRect:]|
(defun show-red-window ()
    (let* ((rect (ns:make-ns-rect 0 0 300 300))
       (w (make-instance 'ns:ns-window
                 :with-content-rect rect
                 :style-mask (logior #$NSTitledWindowMask
                 :backing #$NSBackingStoreBuffered
                 :defer t)))
      (#/setTitle: w #@"Red")
      (#/setContentView: w (#/autorelease (make-instance 'red-view)))
      (#/center w)
      (#/orderFront: w nil)
      (#/contentView w))))
(defmacro with-focused-view (view &body forms)
   `(when (#/lockFocusIfCanDraw ,view)
       (progn , at forms)
        (#/unlockFocus ,view)
        (#/flushGraphics (#/currentContext ns:ns-graphics-context))
        (#/flushWindow (#/window ,view)))))
(setf *v* (show-red-window))
;->#<RED-VIEW <RedView[0x45726578] frame: {{3, 3}, {300, 300}}> 

;;; there is the red window

;;; Modify the "More drawing" code of this example to
;;; (1) draw a line diagonally across the view, and
;;; (2) omit the "hello world" text

(with-focused-view *v*
     (let* ((path (#/bezierPath ns:ns-bezier-path)))
       (#/moveToPoint: path (ns:make-ns-point 10 10))
       (#/lineToPoint: path (ns:make-ns-point 300 300))
       (#/stroke path)
;;; now there is a diagonal line (lower left -> upper right)

;;; Add my-button to this
(#/addSubview: *v* my-button)

;;; There is the button too (with "Hello!"), BUT with a piece of the
;;; diagonal line missing (from (0,0) to just above the "e"
;;; on the button.

;;; Thus I have been able to make a piece of a view, show it, and
;;; then add to it, unlike what happened in the First sequence.

;;; So is it possible that my-button really was drawn in my first sequence,
;;; but in the background colour of its window ?

;; add a title to the button
(#/setTitle: my-button #@"Zootlewirdle")
;;;the title has changed, showing just the quartet ("rdle")
;;; so that I can modify part of an already displayed view.

Again, thanks for any and all assistance.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.clozure.com/pipermail/openmcl-devel/attachments/20110726/e1e66e3d/attachment.html>

More information about the Openmcl-devel mailing list