format PE GUI 4.0

include '%fasminc%\win32a.inc'
entry start

; +--------------+
; | data section |
; +--------------+
section '.data' data readable writeable
	wndClsName	db 'WM_GETTEXT',0
	wndTitle	db 'WM_GETTEXT Demo',0
	wndH		dd ?
	insH		dd ?

	wndCls		WNDCLASS
	wndMsg		MSG

	ctlClsNameEdit	db 'EDIT',0
	ctlClsNameBtn	db 'BUTTON',0
	editH		dd ?
	btnH		dd ?

	txt1		db 'Get Text',0
	buf1		rb 0xFF

; +--------------+
; | code section |
; +--------------+
section '.code' code readable executable
start:
	invoke	GetModuleHandle,NULL
		mov  [insH],eax
		mov  [wndCls.hInstance],eax
		mov  [wndCls.lpfnWndProc],proc_window
		mov  [wndCls.lpszClassName],wndClsName
		mov  [wndCls.hbrBackground],COLOR_BTNFACE + 1
	invoke	LoadIcon,NULL,IDI_APPLICATION
		mov  [wndCls.hIcon],eax
	invoke	LoadCursor,NULL,IDC_ARROW
		mov  [wndCls.hCursor],eax
	invoke	RegisterClass,wndCls

	invoke	CreateWindowEx,NULL,wndClsName,wndTitle,\
		WS_OVERLAPPEDWINDOW + WS_VISIBLE - WS_MAXIMIZEBOX - WS_SIZEBOX,\
		CW_USEDEFAULT,CW_USEDEFAULT,300,400,\
		NULL,NULL,[insH],NULL
		mov  [wndH],eax

window_message_loop_start:
	invoke	GetMessage,wndMsg,NULL,0,0
		or   eax,eax
		je   window_message_loop_end
	invoke	TranslateMessage,wndMsg
	invoke	DispatchMessage,wndMsg
		jmp  window_message_loop_start

window_message_loop_end:
	invoke	ExitProcess,0

;  -------------
;   proc_window
;  -------------
   proc	proc_window,hWnd,uMsg,wParam,lParam
			push ebx esi edi
			cmp  [uMsg],WM_COMMAND
			je   wmCOMMAND
			cmp  [uMsg],WM_CREATE
			je   wmCREATE
			cmp  [uMsg],WM_SIZE
			je   wmSIZE
			cmp  [uMsg],WM_DESTROY
			je   wmDESTROY

	wmDEFAULT:
		invoke	DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
			jmp  wmBYE

	wmCREATE:
		invoke	CreateWindowEx,WS_EX_CLIENTEDGE,ctlClsNameEdit,NULL,\
			WS_VISIBLE + WS_CHILD + ES_MULTILINE + WS_VSCROLL,\
			0,0,0,0,[hWnd],NULL,[insH],NULL
			mov  [editH],eax
		invoke	CreateWindowEx,NULL,ctlClsNameBtn,txt1,\
			WS_VISIBLE + WS_CHILD + BS_CENTER + BS_PUSHLIKE + BS_TEXT,\
			0,0,80,32,[hWnd],NULL,[insH],NULL
			mov  [btnH],eax
			jmp  wmBYE

	wmCOMMAND:
			mov  eax,[lParam]
			cmp  eax,[btnH]
			jne  @f
			mov  eax,[wParam]
			cmp  ax,BN_CLICKED
			jne  @f
		invoke	SendMessage,[editH],WM_GETTEXT,0xFE,buf1
		invoke	MessageBox,[hWnd],buf1,wndTitle,MB_OK
		@@:
			jmp  wmBYE

	wmSIZE:
			mov  eax,[lParam]
			mov  edx,eax
			shr  edx,16
			add  eax,0xFFFF
		invoke	MoveWindow,[editH],0,32,eax,edx,TRUE
			jmp  wmBYE

	wmDESTROY:
		invoke	PostQuitMessage,0

	wmBYE:
			pop  edi esi ebx
			return
   endp

; +----------------+
; | import section |
; +----------------+
section '.idata' import data readable
	library	kernel32, 'KERNEL32.DLL',\
		user32,   'USER32.DLL'

	include '%fasminc%\apia\Kernel32.inc'
	include '%fasminc%\apia\User32.inc'