83 lines
2.9 KiB
Text
83 lines
2.9 KiB
Text
;; @module win32demo.lsp
|
|
;; @description Event loop demo
|
|
;; @author Cyril Slobin
|
|
;; @location http://slobin.pp.ru/newlisp/win32demo.lsp
|
|
;; @version $Id: win32demo.lsp,v 1.4 2010/06/10 02:14:08 slobin Exp $
|
|
|
|
; see also: http://slobin.livejournal.com/339071.html ; added by LM
|
|
|
|
(println "win32demo")
|
|
|
|
(define (import-list library flist)
|
|
(dolist (fname flist) (import library (string fname))))
|
|
|
|
(define-macro (@setq %var %value)
|
|
(set %var (eval %value))
|
|
(println %var " " (eval %var)))
|
|
|
|
(import-list "kernel32" '(GetModuleHandleA GetConsoleWindow))
|
|
(import-list "user32" '(PostQuitMessage DefWindowProcA))
|
|
(import-list "user32" '(LoadCursorA RegisterClassA CreateWindowExA))
|
|
(import-list "user32" '(ShowWindow UpdateWindow))
|
|
(import-list "user32" '(GetMessageA TranslateMessage DispatchMessageA))
|
|
|
|
(setq WM_CREATE 1 WM_DESTROY 2 WM_CHAR 0x102 WM_LBUTTONDOWN 0x201)
|
|
(setq IDC_ARROW 0x7F00 CS_VREDRAW 1 CS_HREDRAW 2 COLOR_WINDOW 5)
|
|
(setq WS_OVERLAPPEDWINDOW 0xCF0000 HWND_MESSAGE -3 SW_SHOWDEFAULT 10)
|
|
|
|
(@setq hinstance (GetModuleHandleA 0))
|
|
(@setq hconsole (GetConsoleWindow))
|
|
(@setq cursor (LoadCursorA 0 IDC_ARROW))
|
|
|
|
(define (window-callback-function hwnd message wparam lparam)
|
|
(cond
|
|
((= message WM_CREATE) (println "created") 0)
|
|
((= message WM_LBUTTONDOWN) (println "click!") 0)
|
|
((= message WM_CHAR) (println (format "char %c" wparam)) 0)
|
|
((= message WM_DESTROY) (println "destroyed") (PostQuitMessage 0) 0)
|
|
(true (DefWindowProcA hwnd message wparam lparam))))
|
|
|
|
(setq wndproc (callback 0 'window-callback-function))
|
|
(setq classname "newlisp class")
|
|
|
|
(setq wc (pack (dup "ld" 10)
|
|
(| CS_HREDRAW CS_VREDRAW) ; style
|
|
wndproc ; lpfnWndProc
|
|
0 ; cbClsExtra
|
|
0 ; cbWndExtra
|
|
hinstance ; hInstance
|
|
0 ; hIcon
|
|
cursor ; hCursor
|
|
(+ COLOR_WINDOW 1) ; hbrBackground
|
|
0 ; lpszMenuName
|
|
classname ; lpszClassName
|
|
))
|
|
|
|
(@setq hwc (RegisterClassA wc))
|
|
(@setq hwnd (CreateWindowExA
|
|
0 ; dwExStyle
|
|
"newlisp class" ; lpClassName
|
|
"newlisp window" ; lpWindowName
|
|
WS_OVERLAPPEDWINDOW ; dwStyle
|
|
80 60 640 480 ; x y w h
|
|
0 ; hwndParent
|
|
0 ; hMenu
|
|
hinstance ; hInstance
|
|
0 ; hParam
|
|
))
|
|
|
|
; hconsole and HWND_MESSAGE are other useful values for hwndParent
|
|
|
|
(ShowWindow hwnd SW_SHOWDEFAULT)
|
|
(UpdateWindow hwnd)
|
|
|
|
(setq msg (pack "n28"))
|
|
|
|
(until (member (GetMessageA msg hwnd 0 0) '(0 -1))
|
|
(TranslateMessage msg)
|
|
(DispatchMessageA msg))
|
|
|
|
(println "the end")
|
|
|
|
(exit)
|
|
|