;***********************************************************************************************************
; Каркас приложения WIN32
; Разработал Пономарев Михаил ака keYMax
; По всем вопросам мыльте mybox@aib.ru
;***********************************************************************************************************
	.686				; Распознавать при компиляции команды процессора 686
	.MMX				; Распознавать при компиляции MMX инструкции
	.XMM				; Распознавать при компиляции SSE инструкции
	
	.MODEL FLAT, STDCALL	; Модель памяти плоская
					; STDCALL - метод вызова через стек

	OPTION CASEMAP:none	; Эта строка указывает компилятору что надо различать
					; заглавные и прописные буквы. ;)
					
;===========================================================================================================
; Включаем прототипы функций которые мы используем в нашей программе.
;===========================================================================================================
    INCLUDE		\masm32\include\windows.inc			; Структуры, константы ...    
    INCLUDE		\masm32\include\kernel32.inc   		; Системные функции приложения ...
    INCLUDE		\masm32\include\user32.inc			; Интерфейс ...
    INCLUDE		\masm32\include\gdi32.inc			; Графический вывод ...
                
    INCLUDELIB	\masm32\lib\kernel32.lib
    INCLUDELIB	\masm32\lib\user32.lib
    INCLUDELIB	\masm32\lib\gdi32.lib

.DATA ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

    szClassName 	db 	"MyClass", 0 				; Имя класса нашего окна
    szAppName 	db 	"Мое приложение !", 0 		; Заголовок нашего окна ( то что будет в заголовке и на панели задач )
    
   ;WNDCLASSEX -----------------------------------------------
    cbSize            	dd	12*4					; Размер структуры 
    style             	dd	CS_HREDRAW or CS_VREDRAW 	; Стиль нашего окна
    lpfnWndProc       	dd	OFFSET WndProc			; Адрес процедуры обработки событий
    cbClsExtra        	dd	0					; Эта хрень нам не нужна
    cbWndExtra        	dd	0					; и эта тоже
    hInstance         	dd	400000h 				; Адрес нашей проги в памяти ( Windows всегда её грузит по этому адресу )
    hIcon             	dd	0 					; Иконка окна по умолчанию ( большая )
    hCursor           	dd	65553					; Курсор окна по умолчанию ( здесь я указал ID обычной стрелки )
    hbrBackground    	dd	BLACK_PEN				; Фон нашего окна черный
    lpszMenuName      	dd	0					; Меню у нас отсутствует
    lpszClassName     	dd	OFFSET szClassName	 	; Указатель на имя нашего класса
    hIconSm           	dd	0 					; Иконка окна по умолчанию ( маленькая - отображается в заголовке )
    
.DATA? ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

    msg			MSG 	<>					; Структура сообщения
    hwnd             	HWND 	?  					; ID нашего окна
    
.CONST ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

    WIN_X		EQU	320
    WIN_Y		EQU	240

.CODE ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Start:  								; Точка входа в нашу программу                 

    invoke  	RegisterClassEx, addr cbSize          			; Регистрируем класс нашего окна            
    
    invoke  	GetSystemMetrics, SM_CXFULLSCREEN     		; Получаем ширину десктопа
    push	eax
    invoke  	GetSystemMetrics, SM_CYFULLSCREEN     		; Получаем высоту десктопа без учета высоты меню
    sub		eax, WIN_Y 						; Вычисляем координаты x и y чтобы окно было по центру
    shr		eax, 1
    pop		ebx
    sub		ebx, WIN_X
    shr		ebx, 1
  
    invoke  	CreateWindowEx, NULL , ADDR szClassName , ADDR szAppName , WS_SYSMENU , \ 
    		ebx ,  eax , WIN_X , WIN_Y , NULL , NULL , hInstance , NULL       
    mov     	 hwnd, eax    					     
    
    invoke	ShowWindow, hwnd, SW_NORMAL			; Показываем окно
    invoke	UpdateWindow, hwnd 				; Обновляем его
    invoke	SetFocus, hwnd 					; Устанавливаем на него фокус
           
 msg_loop:
    invoke  	GetMessage, ADDR msg , NULL , 0 ,  0 
    test		eax, eax				
    je        	end_loop

    invoke  	TranslateMessage, ADDR msg     												
    invoke  	DispatchMessage, ADDR msg      
    jmp     	msg_loop

 end_loop:
    mov 	eax, msg.wParam              			; Если цикл обработки сообщений прерван, то код выхода из программы
    								; передается в поле wParam сообщения MSG. 
    invoke 	ExitProcess, eax
    ret
;===========================================================================================================                                     
 WndProc proc hWnd:HWND , uMsg:UINT, wParam:WPARAM, lParam:LPARAM                                          
;=========================================================
    
    cmp     uMsg, WM_CREATE	 			; Это сообщение посылается окну, когда оно создается
    je      wmCreate
            
    cmp     uMsg, WM_DESTROY	   			; Это сообщение посылается окну, когда оно должно быть уничтожено.
    je      wmDestroy	
    			                 
    invoke  DefWindowProc, hWnd, uMsg, wParam, lParam  	; Если Мы НЕ ХОТИМ обрабатывать полученное сообщение, то
    ret                                                  			; нам надо вызвать DefWindowProc  с параметрами, которые Мы получили.
    								; Эта функция API обрабатывает не интересующие Нас события.  
;-----------------------------------------------------------------------------------------------------------------------------------------                                                               
  wmDestroy:
;------------    
    invoke  	PostQuitMessage, NULL     
    xor       	eax,eax                            
    ret                                         
;-----------------------------------------------------------------------------------------------------------------------------------------                                                               
  wmCreate:                                       
;-----------    
    xor       	eax, eax
    ret 
 WndProc endp
;===========================================================================================================
; Начинаются всякие вспомогательные процедуры
;===========================================================================================================
;Здесь могут располагаться всякие прочие процедуры и функции
end Start 
