;;Przykład 6.5. Aplikacja graficzna z tworzeniem okna (program w języku asemblera MASM32)
.586P
.MODEL flat, STDCALL
;--- pliki ---------
include .\include\grafika.inc
;--- biblioteki ---------
includelib .\lib\user32.lib
includelib .\lib\kernel32.lib
includelib .\lib\gdi32.lib
;--- stałe ---
CSstyle EQU CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
WNDstyle EQU WS_OVERLAPPEDWINDOW
;--- sekcja danych ------
_DATA SEGMENT
 hwnd		DD	0
 hinst	DD	0
 ;---
 msg MSGSTRUCT <?> 
 wndc WNDCLASS <?>
 ;---
 tytul	DB "Aplikacja graficzna",0
 ALIGN 4
 cname	DB "MainClass", 0
 ALIGN 4
 nagl		DB	"Komunikat", 0
 ALIGN 4
 terr1	DB	"Błąd 1!", 0
 ALIGN 4
 terr2	DB	"Błąd 2!", 0
 ALIGN 4
 terr3	DB	"Błąd 3!", 0
_DATA ENDS
;--- sekcja kodu ---------
_TEXT SEGMENT
;;;;;;;;;;;;;;;;;;;;;;;
WndProc PROC
;--- procedura okna ---
;;(jest przytoczona niżej)
WndProc	ENDP
;--- start programu ---
Start:
;--- deskryptor aplikacji ----
 INVOKE GetModuleHandleA, 0
 mov	hinst, EAX
;--- wypełnienie struktury okna WNDCLASS
 mov EAX, [hinst]
 mov [wndc.clsHInstance], EAX
 mov [wndc.clsStyle], CSstyle
 mov [wndc.clsLpfnWndProc], OFFSET WndProc
 mov [wndc.clsCbClsExtra], 0 
 mov [wndc.clsCbWndExtra], 0 
 INVOKE LoadIconA, 0, IDI_APPLICATION	; ikona
 mov [wndc.clsHIcon], EAX
 INVOKE LoadCursorA, 0,	IDC_ARROW ; kursor
 mov	[wndc.clsHCursor], EAX
 INVOKE GetStockObject, WHITE_BRUSH	; tło
 mov [wndc.clsHbrBackground], EAX
 mov [wndc.clsLpszMenuName], 0
 mov DWORD PTR [wndc.clsLpszClassName], OFFSET cname
;--- rejestracja okna --- 
 INVOKE RegisterClassA, OFFSET wndc
 cmp	EAX, 0	; analiza na błąd
 jne @F
 jmp	err1
@@:
;--- utworzenie okna ---
 INVOKE CreateWindowExA, 0, OFFSET cname, OFFSET tytul, \
WNDstyle, 100, 100, 400, 400, 0, 0, hinst, 0
 cmp	EAX, 0	; analiza na błąd
 jne @F
 jmp	err2
@@:
 mov	hwnd, EAX
 INVOKE ShowWindow, hwnd, SW_SHOWNORMAL
 INVOKE UpdateWindow, hwnd
;--- pętla obsługi komunikatów ---
msgloop:
;--- pobranie komunikatu ---
 INVOKE GetMessageA, OFFSET msg, 0, 0, 0
 cmp EAX, 0	; analiza na zakończenie procesu
 jne @F
 jmp	etkon
@@:		
 cmp	EAX, -1	; analiza na błąd
 jne @F
 jmp	err3
@@:		
;---przekształcenie komunikatu: ---
 INVOKE TranslateMessage, OFFSET msg
;---przekazywanie komunikatu do Windows: ---
 INVOKE DispatchMessageA, OFFSET msg
 jmp	msgloop
;--- obsługa błędów ---------
err1:
;--- okno z komunikatem o błędzie----
 INVOKE MessageBoxA,0,OFFSET terr1,OFFSET nagl,0
 jmp	etkon
err2:
;--- okno z komunikatem o błędzie----
 INVOKE MessageBoxA,0,OFFSET terr2,OFFSET nagl,0
 jmp	etkon
err3:
;--- okno z komunikatem o błędzie----
 INVOKE MessageBoxA,0,OFFSET terr3,OFFSET nagl,0
 jmp	etkon
;--- zakończenie procesu ---------
etkon:
 INVOKE ExitProcess, [msg.msWPARAM]
_TEXT	ENDS
END Start

;;Przykład procedury okna dla programu przykładu 6.5
WndProc PROC
;--- procedura okna ---
; DWORD PTR [EBP+14Ch] - parametr LPARAM komunikatu
; DWORD PTR [EBP+10h] - parametr WPARAM komunikatu
; DWORD PTR [EBP+0Ch] - ID = identyfikator komunikatu
; DWORD PTR [EBP+08h] - HWND = deskryptor okna
 ;------------------------------------
 push	EBP	; standardowy prolog
 mov	EBP, ESP	; standardowy prolog
;--- odkładanie na stos
 push	EBX
 push	ESI
 push	EDI
;---
 cmp	DWORD PTR [EBP+0Ch], WM_CREATE
 jne	@F
 jmp	wmCREATE
@@:	
 cmp	DWORD PTR [EBP+0Ch], WM_DESTROY
 jne	@F
 jmp	wmDESTROY
@@:	
 cmp DWORD PTR [EBP+0CH], WM_COMMAND
 jne	@F
 jmp	wmCOMMAND
@@:	
 cmp DWORD PTR [EBP+0CH], WM_LBUTTONDOWN
 jne	@F
 jmp	wmLBUTTON
@@:	
 cmp DWORD PTR [EBP+0CH], WM_RBUTTONDOWN
 jne	@F
 jmp	wmRBUTTON
@@:	
;--- komunikaty nieobsługiwane ---
 INVOKE DefWindowProcA, DWORD PTR [EBP+08h], \
DWORD PTR [EBP+0Ch], DWORD PTR [EBP+10h], DWORD PTR [EBP+14h]
 jmp	konWNDPROC
wmCREATE:
 jmp	konWNDPROC 
wmDESTROY:
 INVOKE PostQuitMessage, 0	; wysyłanie WM_QUIT
 mov	EAX, 0
 jmp	konWNDPROC 
wmCOMMAND:
...	; działania po naciśnięciu klawiszy klawiatury
 mov EAX,0
 jmp konWNDPROC
wmRBUTTON:
...	; działania po naciśnięciu prawego przycisku myszy
 mov EAX,0
 jmp konWNDPROC
wmLBUTTON:
...	; działania po naciśnięciu lewego przycisku myszy
 mov EAX,0
 jmp konWNDPROC
;--- zdejmowanie ze stosu
konWNDPROC:	
 pop	EDI
 pop	ESI
 pop	EBX
 mov	ESP,EBP	; standardowy epilog
 pop	EBP	; standardowy epilog 
 ret	16	; zwolnienie komórek stosu z argumentami
WndProc	ENDP
