; tab = 4
format PE GUI 4.0
entry start

include '%fasminc%\win32a.inc'

macro mmsg reg, [msg, msgHandler] {
	cmp  reg,msg
	je   msgHandler
}

section '.data' data readable writeable
;==============================================================

; window
wc				WNDCLASS
wc.msg			MSG
wc.name			db 'REBAR',0
wc.title		db ' Rebar & Toolbar Control',0
wc.h			dd ?
wc.modh			dd ?

; control
control			INITCOMMONCONTROLSEX

; button
bt.h			dd ?
bt.name			db 'BUTTON',0
BT_ID			= 1001

; rebar
rb.h			dd ?
rb.name			db 'ReBarWindow32',0
rbi				REBARINFO
rbbi			REBARBANDINFO
RB_ID			= 1000

; toolbar
tb.h			dd ?
tb.b1			TBBUTTON

buff			rb 0xff
f1				db '%x',0
rc				RECT



section '.code' code readable executable
;==============================================================

start:
						mov  [control.dwSize],sizeof.INITCOMMONCONTROLSEX
						mov  [control.dwICC],ICC_BAR_CLASSES + ICC_COOL_CLASSES
				invoke	InitCommonControlsEx,control

				invoke	GetModuleHandle,NULL
						mov  [wc.modh],eax
						mov  [wc.hInstance],eax
						mov  [wc.style],0
						mov  [wc.lpfnWndProc],proc_window
						mov  [wc.lpszClassName],wc.name
						mov  [wc.hbrBackground],COLOR_WINDOW+1
				invoke	LoadIcon,NULL,IDI_APPLICATION
						mov  [wc.hIcon],eax
				invoke	LoadCursor,NULL,IDC_ARROW
						mov  [wc.hCursor],eax
				invoke	RegisterClass,wc

				invoke	LoadMenu,[wc.hInstance],101
				invoke	CreateWindowEx,0,wc.name,wc.title,\
						WS_OVERLAPPEDWINDOW,\
						200,200,500,400,\
						NULL,eax,[wc.modh],NULL
						mov  [wc.h],eax
				invoke	ShowWindow,eax,SW_SHOW
				invoke	UpdateWindow,[wc.h]

			msg_start:
				invoke	GetMessage,wc.msg,NULL,0,0
						or   eax,eax
						je   msg_end
				invoke	TranslateMessage,wc.msg
				invoke	DispatchMessage,wc.msg
						jmp  msg_start
			msg_end:
				invoke	ExitProcess,0





;																								
;																								
proc proc_window hwnd,msg,wparam,lparam

						push ebx edi esi
						mov  eax,[msg]

						mmsg eax,\
						WM_COMMAND,			.wmcommand,\
						WM_CREATE,			.wmcreate,\
						WM_CLOSE,			.wmclose

.wmdefault:
;               
				invoke	DefWindowProc,[hwnd],[msg],[wparam],[lparam]
						jmp  .wmbye

.wmcommand:
;               
						jmp  .wmbye

.wmcreate:
;               
				stdcall	rebar_build,[hwnd]
						jmp  .wmbye

.wmclose:
;               
				invoke  PostQuitMessage,0

.wmprocessed:
;               
						mov  eax,1
.wmbye:
;               
						pop  esi edi ebx
						ret
endp
;																								
;																								





;																								
;																								
proc rebar_build hwnd
						push ebx edi esi
				invoke	GetClientRect,[hwnd],rc
				invoke	CreateWindowEx,WS_EX_TOOLWINDOW,rb.name,NULL,\
							WS_VISIBLE + WS_BORDER + WS_CHILD + WS_CLIPCHILDREN +\
							WS_CLIPSIBLINGS + RBS_VARHEIGHT + RBS_BANDBORDERS +\
							CCS_NODIVIDER + CCS_NOPARENTALIGN + CCS_ADJUSTABLE + 0,\
							0,0,[rc.right],0,[hwnd],RB_ID,[wc.modh],NULL
						mov  [rb.h],eax
						cmp  eax,NULL
						jne  @f
				invoke	MessageBox,NULL,bt.name,bt.name,0
				@@:
						mov  [rbi.cbSize],sizeof.REBARINFO
						mov  [rbi.fMask],0
						mov  [rbi.himl],NULL
				invoke	SendMessage,[rb.h],RB_SETBARINFO,0,rbi

				invoke	CreateWindowEx,0,bt.name,bt.name,\
							WS_CHILD or BS_PUSHBUTTON,\
							0,0,90,40,[rb.h],BT_ID,[wc.modh],NULL
						mov  [bt.h],eax
				invoke	GetWindowRect,eax,rc
				invoke	RtlZeroMemory,rbbi,sizeof.REBARBANDINFO
						mov  [rbbi.cbSize],sizeof.REBARBANDINFO
						mov  [rbbi.fMask],RBBIM_SIZE or RBBIM_CHILD or RBBIM_CHILDSIZE or \
						     RBBIM_STYLE or RBBIM_ID or RBBIM_TEXT
						mov  [rbbi.fStyle],RBBS_CHILDEDGE + RBBS_GRIPPERALWAYS
						mov  [rbbi.cx],150
						mov  [rbbi.wID],BT_ID
						
						mov  eax,[rc.right]
						sub  eax,[rc.left]
						mov  [rbbi.cxMinChild],eax
						mov  eax,[rc.bottom]
						sub  eax,[rc.top]
						mov  [rbbi.cyMinChild],eax
						
						push [bt.h]
						pop  [rbbi.hwndChild]
						mov  [rbbi.lpText],bt.name
				invoke	SendMessage,[rb.h],RB_INSERTBAND,-1,rbbi
				
				
                ; toolbar control
                invoke	RtlZeroMemory,rbbi,sizeof.REBARBANDINFO
						mov  [tb.b1.iBitmap],0
						mov  [tb.b1.idCommand],TBDB
						mov  [tb.b1.fsState],TBSTATE_ENABLED
						mov  [tb.b1.fsStyle],TBSTYLE_BUTTON
						mov  [tb.b1.dwData],0
						mov  [tb.b1.iString],0
				invoke	CreateToolbarEx,[rb.h],WS_CHILD + +WS_CLIPCHILDREN+CCS_ADJUSTABLE+WS_VISIBLE+TBSTYLE_FLAT,\
							102,\
							4,[wc.modh],102,tb.b1,1,\
							24,24,24,24,\
							sizeof.TBBUTTON
						mov  [tb.h],eax
				;invoke	SendMessage,[tb.h],TB_AUTOSIZE,0,0
						mov  [rbbi.cbSize],sizeof.REBARBANDINFO
						mov  [rbbi.fMask],RBBIM_STYLE+RBBIM_CHILD+RBBIM_CHILDSIZE+RBBIM_SIZE+RBBIM_TEXT
						mov  [rbbi.fStyle],RBBS_CHILDEDGE + RBBS_GRIPPERALWAYS
						mov  [rbbi.lpText],rb.name
						push [tb.h]
						pop  [rbbi.hwndChild]
						mov  [rbbi.cxMinChild],0
						mov  [rbbi.cyMinChild],60
						mov  [rbbi.cx],250
				invoke	SendMessage,[rb.h],RB_INSERTBAND,-1,rbbi

				stdcall	rebar_move,[hwnd]

						pop  esi edi ebx
						ret
endp
;																								
;																								






;																								
;																								
proc rebar_move hwnd
						push ebx edi esi
				invoke	GetClientRect,[hwnd],rc
						mov  eax,[rc.right]
						sub  eax,[rc.left]
						mov  ecx,[rc.bottom]
						sub  ecx,[rc.top]
				invoke	MoveWindow,[rb.h],0,0,eax,ecx,TRUE
						pop  esi edi ebx
						ret
endp
;																								
;																								






;==============================================================
section '.idata' import data readable
;==============================================================
        library kernel32,'KERNEL32.DLL',\
				user32,  'USER32.DLL',\
				gdi32,   'GDI32.DLL',\
				comctl32,'COMCTL32.DLL',\
				comdlg32,'COMDLG32.DLL'
                        
		include	'%fasminc%\apia\Kernel32.inc'
		include	'%fasminc%\apia\User32.inc'
		include	'%fasminc%\apia\Gdi32.inc'
		include	'%fasminc%\apia\Comctl32.inc'
		include	'%fasminc%\apia\Comdlg32.inc'




;==============================================================
section '.rsrc' resource data readable
;==============================================================

MOPEN	= 10110
MCLOSE	= 10111
MEXIT	= 10112

TBDB	= 10210
TBTB	= 10211
TBQ		= 10212
TBF		= 10213

        directory	RT_MENU,menus,\
        			RT_BITMAP,bitmaps

        resource	menus,\
					101,LANG_NEUTRAL,menumain

        resource	bitmaps,\
					102,LANG_NEUTRAL,toolbar
        
        bitmap		toolbar,'toolbar.bmp'
        
        menu		menumain
					menuitem		'&File',0,MFR_POPUP + MFR_END
					menuitem			'&Open',MOPEN
					menuitem			'&Close',MCLOSE
					menuseparator
					menuitem			'&Exit',MEXIT,MFR_END