
	;################################
	;#   http://babekcom.chat.ru/   #
	;################################

.386
.model flat, stdcall

include const.inc
include struct.inc
include macro.inc
include extrn.inc
includelib import32.lib

.const

szTitleName      db 'Babekcom Assembly Program', 0
szClassName      db 'ASMCLASS32',0
szMenuName	 db 0

ID_ICON		= 100
ID_CURSOR	= 200
ID_EXIT		= 399
ID_ABOUT	= 999

.data

wc		WNDCLASS <?>
msg		MSGSTRUCT  <?>
PaintStruct	PAINTSTRUCT <?>

.data?

CommandLine	dd ?
; HANDLES
hInstance	dd ?
hWnd		dd ?
hMenu		dd ?
hDC		dd ?
hRgn		dd ?
hRgn1		dd ?
hRgn2		dd ?

.code

start:
	call GetModuleHandleA,0
	mov hInstance,eax	; идентификатор программы

	call GetCommandLineA
	mov CommandLine, eax

	call WinMain,hInst,NULL,CommandLine,SW_SHOWNORMAL
	call ExitProcess,eax

; #########################################################################

WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD

; подготовить и зарегистрировать класс (WNDCLASS structure)

        mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
        mov [wc.clsLpfnWndProc], offset WndProc
        mov [wc.clsCbClsExtra],NULL
        mov [wc.clsCbWndExtra],NULL
	push [hInstance]
	pop [wc.clsHInstance]
        call LoadIconA,hInstance,ID_ICON
        mov [wc.clsHIcon], eax

        call LoadCursorA,hInstance,ID_CURSOR
        mov [wc.clsHCursor],eax

        mov [wc.clsHbrBackground], COLOR_WINDOW
        mov dword ptr [wc.clsLpszMenuName], offset szMenuName
        mov dword ptr [wc.clsLpszClassName], offset szClassName
        mov [wc.hIconSm],0

	call RegisterClassA, offset wc

	push 0                    ; lpParam
	push [wc.clsHInstance]    ; hInstance
	push 0                    ; menu
	push 0                    ; parent hwnd
	push CW_USEDEFAULT        ; height
	push CW_USEDEFAULT        ; width
	push CW_USEDEFAULT        ; y
	push CW_USEDEFAULT        ; x
	push WS_OVERLAPPEDWINDOW  ; Style
	push offset szTitleName   ; Title string
	push offset szClassName   ; Class name
	push 0                    ; extra style
	call CreateWindowExA
	mov [hWnd],eax            ; идентификатор окна

        call LoadMenuA,hInstance,300  ; menu ID
        mov hMenu,eax
        call SetMenu,hWnd,eax

        ; показать окно
	call ShowWindow,[hWnd],SW_SHOWNORMAL
	call UpdateWindow,[hWnd]

	;##############################
	;# проверка сообщений от окна #
	;##############################

msg_loop:
	call    GetMessageA,offset msg,NULL,0,0
        cmp     eax, 0				; проверка на WM_QUIT
        je      end_loop

        call    TranslateMessage,offset msg
        call    DispatchMessageA,offset msg
        jmp     short msg_loop
end_loop:
        mov     eax,[msg.msWPARAM]
	ret

WinMain endp
;######################################################################

WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD,\
                 wparam:DWORD, lparam:DWORD

	cmp     [wmsg], WM_COMMAND
	je      wmcommand

	cmp     [wmsg], WM_CREATE
	je      wmcreate

	cmp     [wmsg], WM_PAINT
	je      wmpaint

        cmp     [wmsg], WM_CLOSE
        je      wmclose

	cmp     [wmsg], WM_DESTROY
	je      wmdestroy

        call    DefWindowProcA,[hwnd],[wmsg],[wparam],[lparam]
        ret

wmcommand:
	cmp     [wparam],ID_EXIT
	je      wmclose

	cmp     [wparam],ID_ABOUT
	je      showabout

	ret

showabout:
        szText About,""
        szText Copyright,"Copyright (C) Babekcom Engineering Group 2000"
        call	ShellAboutA,hwnd,offset About,offset Copyright,[wc.clsHIcon]
	xor	eax,eax
	ret
wmcreate:
; вызываем созданную нами процедуру, которая создаёт и комбинирует регионы,
; а затем показывает нам окно в виде комбинированного региона.
	call	RegionProc, hwnd
wmpaint:
	call	BeginPaint,hwnd,offset PaintStruct
	mov	[hDC], eax
	call	PaintProc,hwnd,[hDC]
	call	EndPaint,hwnd,offset PaintStruct
	xor	eax,eax
	ret
wmclose:
        szText TheTitle,""
        szText TheText,"Вы действительно хотите выйти из программы?"
        call MessageBoxA,hwnd,offset TheText,offset TheTitle,MB_YESNO
          .if eax == IDNO
            xor eax,eax
            ret
          .endif
wmdestroy:
        call    PostQuitMessage,NULL
        xor     eax,eax
        ret

WndProc endp
;######################################################################
PaintProc proc hwnd:DWORD, hDc:DWORD

	xor	eax,eax
	ret
PaintProc endp
;######################################################################
RegionProc proc	hwnd:DWORD
	; создаём элиптический регион1
	call	CreateEllipticRgn, 40, 120, 560, 280
	mov	hRgn1,eax	; сохраняем его хендл

	; создаём элиптический регион2
	call	CreateEllipticRgn, 120, 20, 480, 380
	mov	hRgn2,eax	; сохраняем его хендл
	; и таких регионов может быть сколько угодно

	; создаём прямоугольный регион, в который
	; скомбинируем два предыдущих региона
	call	CreateRectRgn, 0, 0, 600, 400
	mov	hRgn,eax	; сохраняем его хендл

	; комбинируем регионы
	call	CombineRgn, hRgn, hRgn1, hRgn2, RGN_XOR

	; покажем наше окно в виде комбинированного региона
	call	SetWindowRgn, hwnd, hRgn,TRUE
	xor	eax,eax
	ret

RegionProc endp
;######################################################################
end start
