format PE GUI 4.0
include '%fasminc%\win32a.inc'

entry start

section '.data' data readable writeable
	wndClsName	db 'TestClass',0
	wndTitle	db 'Test Window',0
	insH		dd ?
	wndH		dd ?
	appH		dd ?
	wndMsg	MSG
	hWndMain	dd ?
	hWndPrefs	dd ?
	prefs_dp_vals	db '0',0,0,0,0,0,0,0,0,0
			db '2',0,0,0,0,0,0,0,0,0
			db '10',0,0,0,0,0,0,0,0
			db '50',0,0,0,0,0,0,0,0
			db '100',0,0,0,0,0,0,0
			db '1000',0,0,0,0,0,0
			db '10000',0,0,0,0,0
			db '100000',0,0,0,0
			db '1000000',0,0,0
			db '10000000',0,0
                        db '100000000',0
	RegKey		db 'KeyNotHere', 0
	RegHnd		dd ?
	LErrStrBuff	dd ?
	ErrTitle	db 'Error', 0


	wndCls		WNDCLASS 0,proc_window,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,wndClsName

section '.code' code readable executable
start:
	invoke	GetModuleHandle,NULL
		mov  [insH],eax
		mov  [wndCls.lpszMenuName],M_MAIN
	invoke	RegisterClass,wndCls
	invoke	CreateWindowEx,NULL,wndClsName,wndTitle,WS_SYSMENU+WS_MINIMIZEBOX+WS_VISIBLE,0,0,420,200,NULL,NULL,[insH],NULL
		mov  [hWndMain],eax
	pushad
	invoke	RegOpenKey, HKEY_CURRENT_USER, RegKey, RegHnd
	or	eax, eax		;ERROR_SUCCESS = 0
	jz	@f
	call	ShowError
	jmp	.l1
    @@: invoke	RegCloseKey, dword [RegHnd]
	or	eax, eax		;ERROR_SUCCESS = 0
	jz	.l1
	call	ShowError
    .l1:
	popad

wndMsgStart:
	invoke	GetMessage,wndMsg,NULL,0,0
		or   eax,eax
		je   wndMsgEnd
	invoke	TranslateMessage,wndMsg
	invoke	DispatchMessage,wndMsg
		jmp  wndMsgStart
wndMsgEnd:
	invoke	ExitProcess,0

proc proc_window,hWnd,uMsg,wParam,lParam
		push ebx esi edi
		cmp  [uMsg],WM_CLOSE
		je   .wmCLOSE
		cmp  [uMsg],WM_DESTROY
		je   .wmDESTROY
		cmp  [uMsg],WM_COMMAND
		je   .wmCOMMAND
	.wmDEFAULT:
		invoke	DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
		jmp  .wmBYE

	.wmCOMMAND:
		mov	eax, [wParam]
		and	eax, 0FFFFh
		cmp	eax, MI_EXIT
		je	.mi_exit
		cmp	eax, MI_PREF
		je	.mi_pref
		jmp	.wmBYE

	    .mi_pref:
		invoke	CreateDialogParam, [insH], IDD_PREFS, [hWndMain], SetPrefsProc, 0
		jmp	.wmBYE

	    .mi_exit:
		invoke	SendMessage, [hWndMain], WM_CLOSE, eax, 0
		jmp	.wmBYE

	.wmCLOSE:
		invoke	DestroyWindow,[hWnd]
		jmp	.wmBYE

	.wmDESTROY:
		invoke	PostQuitMessage,0

	.wmBYE:
		pop  edi esi ebx
		ret
endp

proc SetPrefsProc, hdlg, msg, wparam, lparam
		push	ebx esi edi
		push	[hdlg]
		pop	[hWndPrefs]
		cmp	[msg], WM_INITDIALOG
		je	.wminit
		cmp	[msg], WM_CLOSE
		je	.wmclose
		xor	eax, eax
		jmp	.finish

	    .wminit:
		push	ecx ebx
		mov	ebx, prefs_dp_vals
		mov	ecx, 11
	    @@:
		push	ecx ebx
		invoke	SendDlgItemMessage, [hWndPrefs], ID_DECPLACES, CB_ADDSTRING, 0, ebx
		pop	ebx ecx
		add	ebx, 10
		loop	@b
		invoke	SendDlgItemMessage, [hWndPrefs], ID_DECPLACES, CB_SETCURSEL, 4, 0
		pop	ebx ecx
		jmp	.finish
	    .wmclose:
		invoke	EndDialog, [hWndPrefs], 0
		mov	[hWndPrefs], 0
	    .finish:
		pop	edi esi ebx
		ret
endp

ShowError:
		pushad
		invoke	GetLastError
		invoke	FormatMessage,\
			FORMAT_MESSAGE_FROM_SYSTEM+\
                        FORMAT_MESSAGE_ALLOCATE_BUFFER,\                                ;Source & options.
			NULL,\								;Pointer to source.
			eax,\								;Message ID.
			LANG_NEUTRAL,\							;Language ID.
			LErrStrBuff,\							;Pointer to buffer.
			0,\								;Size of buffer.
			NULL								;Arguments.
		invoke	MessageBox,[hWndMain],[LErrStrBuff],ErrTitle,MB_ICONERROR+MB_OK
		popad
		ret

section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
	user32,  'USER32.DLL',\
	gdi32,	 'GDI32.DLL',\
	comdlg32,'COMDLG32.DLL',\
	advapi32,'ADVAPI32.DLL'

include '%fasminc%\apia\Kernel32.inc'
include '%fasminc%\apia\User32.inc'
include '%fasminc%\apia\Gdi32.inc'
include '%fasminc%\apia\Comdlg32.inc'
include '%fasminc%\apia\Advapi32.inc'

section '.rsrc' resource data readable
	M_MAIN		  = 30
	MI_EXIT 	  = 1003
	MI_PREF 	  = 1104
	ID_STATIC	  = 2000
	ID_DECPLACES	  = 2010
	IDD_PREFS	  = 3000

directory \
	RT_MENU, menus,\
	RT_DIALOG, dialogs

resource menus,\
	M_MAIN, LANG_ENGLISH + SUBLANG_DEFAULT, main_menu

resource dialogs,\
	IDD_PREFS, LANG_ENGLISH + SUBLANG_DEFAULT, preferences_dlg

menu main_menu
     menuitem  '&File',0,MFR_POPUP
     menuitem		'E&xit',MI_EXIT,MFR_END
     menuitem  '&Edit',0,MFR_POPUP+MFR_END
     menuitem		'P&references',MI_PREF,MFR_END

dialog	preferences_dlg, 'Preferences', 0, 0, 214, 80, \
	DS_MODALFRAME + WS_POPUP + WS_CAPTION + WS_SYSMENU + WS_VISIBLE, \
	0, 0, 'MS Shell Dlg', 8

	dialogitem 'STATIC', 'DP:', ID_STATIC, 5, 10, 20, 9, SS_RIGHT + WS_VISIBLE
	dialogitem 'COMBOBOX', '', ID_DECPLACES, 27, 8, 57, 50, CBS_DROPDOWN + WS_VSCROLL + WS_VISIBLE + WS_BORDER + WS_TABSTOP
enddialog

