win32: more menus and widgets

original commit: 70b26a58855d66ee521171005189bc23f8b1e0fd
This commit is contained in:
Matthew Flatt 2010-10-01 20:12:22 -06:00
parent 428cf1577e
commit 536cf6582b
12 changed files with 131 additions and 31 deletions

View File

@ -254,4 +254,7 @@
(def/public-unimplemented scroll) (def/public-unimplemented scroll)
(def/public-unimplemented warp-pointer) (def/public-unimplemented warp-pointer)
(def/public-unimplemented view-start) (def/public-unimplemented view-start)
(def/public-unimplemented set-resize-corner))))
(define/public (set-resize-corner on?)
(void)))))

View File

@ -3,6 +3,7 @@
racket/draw racket/draw
ffi/unsafe ffi/unsafe
"../../syntax.rkt" "../../syntax.rkt"
"../../lock.rkt"
"../common/event.rkt" "../common/event.rkt"
"item.rkt" "item.rkt"
"utils.rkt" "utils.rkt"
@ -18,6 +19,8 @@
(define CB_SETCURSEL #x014E) (define CB_SETCURSEL #x014E)
(define CB_GETCURSEL #x0147) (define CB_GETCURSEL #x0147)
(define CBN_SELENDOK 9) (define CBN_SELENDOK 9)
(define CB_ADDSTRING #x0143)
(define CB_RESETCONTENT #x014B)
(define choice% (define choice%
(class item% (class item%
@ -59,7 +62,8 @@
(set-control-font font) (set-control-font font)
;; setting the choice height somehow sets the ;; setting the choice height somehow sets the
;; popup-menu size, not the control that you see ;; popup-menu size, not the control that you see
(auto-size choices 0 0 40 0 (auto-size (if (null? choices) (list "Choice") choices)
0 0 40 0
(lambda (w h) (lambda (w h)
(set-size -11111 -11111 w (* h 8)))) (set-size -11111 -11111 w (* h 8))))
@ -85,6 +89,18 @@
(define/public (number) num-choices) (define/public (number) num-choices)
(def/public-unimplemented clear) (define/public (clear)
(def/public-unimplemented append))) (atomically
(SendMessageW hwnd CB_RESETCONTENT 0 0)
(set! num-choices 0)))
(public [append* append])
(define (append* str)
(atomically
(SendMessageW/str hwnd CB_ADDSTRING 0 str)
(set! num-choices (add1 num-choices))
(when (= 1 num-choices) (set-selection 0))))))

View File

@ -598,6 +598,16 @@
(define SW_SHOW 5) (define SW_SHOW 5)
(define SW_HIDE 0) (define SW_HIDE 0)
(define SW_SHOWNORMAL 1)
(define SW_SHOWMINIMIZED 2)
(define SW_SHOWMAXIMIZED 3)
(define SW_MAXIMIZE 3)
(define SW_SHOWNOACTIVATE 4)
(define SW_MINIMIZE 6)
(define SW_SHOWMINNOACTIVE 7)
(define SW_RESTORE 9)
(define SW_SHOWDEFAULT 10)
(define SW_FORCEMINIMIZE 11)
(define HORZRES 8) (define HORZRES 8)
(define VERTRES 10) (define VERTRES 10)

View File

@ -24,9 +24,15 @@
(define-gdi32 GetDeviceCaps (_wfun _HDC _int -> _int)) (define-gdi32 GetDeviceCaps (_wfun _HDC _int -> _int))
(define-user32 DrawMenuBar (_wfun _HWND -> (r : _BOOL)
-> (unless r (failed 'DrawMenuBar))))
(define-user32 IsZoomed (_wfun _HWND -> _BOOL))
(define-user32 SystemParametersInfoW (_wfun _UINT _UINT _pointer _UINT -> (r : _BOOL) (define-user32 SystemParametersInfoW (_wfun _UINT _UINT _pointer _UINT -> (r : _BOOL)
-> (unless r (failed 'SystemParametersInfo)))) -> (unless r (failed 'SystemParametersInfo))))
(define SPI_GETWORKAREA #x0030) (define SPI_GETWORKAREA #x0030)
(define (display-size xb yb ?) (define (display-size xb yb ?)
@ -99,6 +105,9 @@
hInstance hInstance
#f)) #f))
(define saved-title (or label ""))
(define hidden-zoomed? #f)
(super-new [parent #f] (super-new [parent #f]
[hwnd (create-frame parent label w h style)] [hwnd (create-frame parent label w h style)]
[style (cons 'invisible style)]) [style (cons 'invisible style)])
@ -124,7 +133,11 @@
;; atomic mode ;; atomic mode
(when (eq? mouse-frame this) (set! mouse-frame #f)) (when (eq? mouse-frame this) (set! mouse-frame #f))
(register-frame-shown this on?) (register-frame-shown this on?)
(super direct-show on?)) (when (and (not on?) (is-shown?))
(set! hidden-zoomed? (is-maximized?)))
(super direct-show on? (if hidden-zoomed?
SW_SHOWMAXIMIZED
SW_SHOW)))
(define/private (stdret f d) (define/private (stdret f d)
(if (is-dialog?) d f)) (if (is-dialog?) d f))
@ -275,9 +288,25 @@
(def/public-unimplemented designate-root-frame) (def/public-unimplemented designate-root-frame)
(def/public-unimplemented system-menu) (def/public-unimplemented system-menu)
(def/public-unimplemented set-modified)
(def/public-unimplemented is-maximized?) (define modified? #f)
(def/public-unimplemented maximize) (define/public (set-modified on?)
(unless (eq? modified? (and on? #t))
(set! modified? (and on? #t))
(set-title saved-title)))
(define/public (is-maximized?)
(if (is-shown?)
hidden-zoomed?
(IsZoomed hwnd)))
(define/public (maximize on?)
(if (is-shown?)
(set! hidden-zoomed? (and on? #t))
(ShowWindow hwnd (if on?
SW_MAXIMIZE
SW_RESTORE))))
(def/public-unimplemented iconized?) (def/public-unimplemented iconized?)
(def/public-unimplemented get-menu-bar) (def/public-unimplemented get-menu-bar)
@ -286,6 +315,9 @@
(atomically (atomically
(set! menu-bar mb) (set! menu-bar mb)
(send mb set-parent this))) (send mb set-parent this)))
(define/public (draw-menu-bar)
(DrawMenuBar hwnd))
(define/override (is-frame?) #t) (define/override (is-frame?) #t)
@ -294,5 +326,8 @@
(def/public-unimplemented iconize) (def/public-unimplemented iconize)
(define/public (set-title s) (define/public (set-title s)
(SetWindowTextW (get-hwnd) s))) (atomically
(set! saved-title s)
(SetWindowTextW (get-hwnd) (string-append s (if modified? "*" ""))))))

View File

@ -1,5 +1,6 @@
#lang scheme/base #lang racket/base
(require scheme/class (require racket/class
(only-in racket/list take drop)
ffi/unsafe ffi/unsafe
"../../lock.rkt" "../../lock.rkt"
"../../syntax.rkt" "../../syntax.rkt"
@ -22,22 +23,35 @@
(define hmenu (CreateMenu)) (define hmenu (CreateMenu))
(define menus null) (define menus null)
(define parent #f)
(define/public (set-label-top pos str) (define/public (set-label-top pos str)
(void)) ;; FIXME (send (list-ref menus pos) set-menu-label hmenu pos str)
(refresh))
(def/public-unimplemented number) (def/public-unimplemented number)
(def/public-unimplemented enable-top) (def/public-unimplemented enable-top)
(define/public (delete which pos) (define/public (delete which pos)
(void)) ;; FIXME (atomically
(set! menus (append (take menus pos)
(drop menus (add1 pos))))
(RemoveMenu hmenu pos MF_BYPOSITION)
(refresh)))
(define/private (refresh)
(when parent
(send parent draw-menu-bar)))
(public [append-item append]) (public [append-item append])
(define (append-item m lbl) (define (append-item m lbl)
(let ([l (append menus (list m))]) (let ([l (append menus (list m))])
(atomically (atomically
(set! menus l) (set! menus l)
(send m set-parent this lbl hmenu)))) (send m set-parent this lbl hmenu)))
(refresh))
(define/public (set-parent f) (define/public (set-parent f)
(SetMenu (send f get-hwnd) hmenu) (SetMenu (send f get-hwnd) hmenu)
(DrawMenuBar (send f get-hwnd))))) (set! parent f)
(send parent draw-menu-bar))))

View File

@ -17,12 +17,6 @@
(let ([wb (hash-ref ids id #f)]) (let ([wb (hash-ref ids id #f)])
(and wb (weak-box-value wb)))) (and wb (weak-box-value wb))))
(define-user32 GetMenuState (_wfun _HMENU _UINT _UINT -> _UINT))
(define-user32 CheckMenuItem (_wfun _HMENU _UINT _UINT -> _DWORD))
(define-user32 ModifyMenuW (_wfun _HMENU _UINT _UINT _UINT_PTR _string/utf-16
-> (r : _BOOL)
-> (unless r (failed 'ModifyMenuW))))
(defclass menu-item% object% (defclass menu-item% object%
(define id (define id

View File

@ -48,6 +48,12 @@
(proc (car items) pos)] (proc (car items) pos)]
[else (loop (cdr items) (add1 pos))]))) [else (loop (cdr items) (add1 pos))])))
(define/public (set-menu-label bar-hmenu pos str)
(ModifyMenuW bar-hmenu pos
(bitwise-ior MF_BYPOSITION MF_STRING MF_POPUP)
(cast hmenu _HMENU _UINT_PTR)
str))
(define/public (set-label id str) (define/public (set-label id str)
(with-item (with-item
id id
@ -78,9 +84,14 @@
(lambda (i pos) (lambda (i pos)
(send i get-check hmenu pos)))) (send i get-check hmenu pos))))
(def/public-unimplemented delete-by-position) (define/public (delete-by-position pos)
(RemoveMenu hmenu pos MF_BYPOSITION))
(define/public (delete id) (define/public (delete id)
(void)) (with-item
id
(lambda (i pos)
(RemoveMenu hmenu pos MF_BYPOSITION))))
(public [append-item append]) (public [append-item append])
(define (append-item id label help-str-or-submenu chckable?) (define (append-item id label help-str-or-submenu chckable?)

View File

@ -143,8 +143,7 @@
(define/override (control-scrolled) (define/override (control-scrolled)
(when value-hwnd (when value-hwnd
(let ([val (get-value)]) (set-text (get-value)))
(SetWindowTextW value-hwnd (format "~s" val))))
(queue-window-event this (lambda () (queue-window-event this (lambda ()
(callback this (callback this
(new control-event% (new control-event%
@ -152,7 +151,12 @@
[time-stamp (current-milliseconds)]))))) [time-stamp (current-milliseconds)])))))
(define/public (set-value val) (define/public (set-value val)
(SendMessageW slider-hwnd TBM_SETPOS 1 val)) (SendMessageW slider-hwnd TBM_SETPOS 1 val)
(when value-hwnd
(set-text val)))
(define/private (set-text val)
(SetWindowTextW value-hwnd (format "~s" val)))
(define/public (get-value) (define/public (get-value)
(SendMessageW slider-hwnd TBM_GETPOS 0 0))) (SendMessageW slider-hwnd TBM_GETPOS 0 0)))

View File

@ -113,5 +113,6 @@
(bitwise-and v #xFFFF)) (bitwise-and v #xFFFF))
(define (MAKELONG a b) (define (MAKELONG a b)
(bitwise-ior (arithmetic-shift b 16) a)) (bitwise-ior (arithmetic-shift b 16)
(bitwise-and a #xFFFF)))
(define (MAKELPARAM a b) (MAKELONG a b)) (define (MAKELPARAM a b) (MAKELONG a b))

View File

@ -23,7 +23,11 @@
SetCursor SetCursor
GetDC GetDC
ReleaseDC ReleaseDC
InvalidateRect) InvalidateRect
GetMenuState
CheckMenuItem
ModifyMenuW
RemoveMenu)
(define gdi32-lib (ffi-lib "gdi32.dll")) (define gdi32-lib (ffi-lib "gdi32.dll"))
(define user32-lib (ffi-lib "user32.dll")) (define user32-lib (ffi-lib "user32.dll"))
@ -72,3 +76,11 @@
(define-user32 InvalidateRect (_wfun _HWND (_or-null _RECT-pointer) _BOOL -> (r : _BOOL) (define-user32 InvalidateRect (_wfun _HWND (_or-null _RECT-pointer) _BOOL -> (r : _BOOL)
-> (unless r (failed 'InvalidateRect)))) -> (unless r (failed 'InvalidateRect))))
(define-user32 GetMenuState (_wfun _HMENU _UINT _UINT -> _UINT))
(define-user32 CheckMenuItem (_wfun _HMENU _UINT _UINT -> _DWORD))
(define-user32 ModifyMenuW (_wfun _HMENU _UINT _UINT _UINT_PTR _string/utf-16
-> (r : _BOOL)
-> (unless r (failed 'ModifyMenuW))))
(define-user32 RemoveMenu (_wfun _HMENU _UINT _UINT -> (r : _BOOL)
-> (unless r (failed 'RemoveMenu))))

View File

@ -181,12 +181,12 @@
(atomically (direct-show on?))) (atomically (direct-show on?)))
(define shown? #f) (define shown? #f)
(define/public (direct-show on?) (define/public (direct-show on? [on-mode SW_SHOW])
;; atomic mode ;; atomic mode
(set! shown? (and on? #t)) (set! shown? (and on? #t))
(register-child-in-parent on?) (register-child-in-parent on?)
(unless on? (not-focus-child this)) (unless on? (not-focus-child this))
(ShowWindow hwnd (if on? SW_SHOW SW_HIDE))) (ShowWindow hwnd (if on? on-mode SW_HIDE)))
(unless (memq 'invisible style) (unless (memq 'invisible style)
(show #t)) (show #t))

View File

@ -6,7 +6,7 @@
(define my-txt #f) (define my-txt #f)
(define my-lb #f) (define my-lb #f)
(define noisy? #t) (define noisy? #f)
(define mdi-frame #f) (define mdi-frame #f)
(define (mdi) (define (mdi)