include \masm32\include\masm32rt.inc ; підключаємо "магію" MASM32 (windows, kernel32, user32, gdi32, світчкейси і інші класні макроси)
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD ; прототип процедури WinMain
@RGB macro red, green, blue ; макрос для задання кольору в RGB
xor eax, eax
mov ah, blue
shl eax, 8
mov ah, green
mov al, red
endm
@SetWndSize macro Name, sWidth, sHeight ; макрос для задання розмірів вікна
invoke SetWindowPos, Name, NULL, NULL, NULL, \
sWidth, sHeight, SWP_NOZORDER or SWP_NOACTIVATE or SWP_NOMOVE
endm
.DATA ; нижче дані, частини сегментів програми
ClassName db "WinAPIPaint", 0 ; клас вікна
AppName db "WinAPI + GDI. Малювання. Будинок. by Vladimir Shevchuk", 0 ; заголовок вікна
.DATA? ; невизначені сегменти
hInstance HINSTANCE ? ; інстанс хендл програми
.CODE ; код програми
start: ; початок програми
invoke GetModuleHandle, NULL ; отримуємо інстанс хендл
mov hInstance, eax ; hmodule == hinstance
invoke WinMain, hInstance, NULL, NULL, SW_SHOWDEFAULT ; викликаємо WinMain
invoke ExitProcess, eax ; виходимо
WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD ; процедура WinMain
LOCAL wc:WNDCLASSEX ; створюємо локальні змінні для стеку
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize, SIZEOF WNDCLASSEX ; заповнюємо параметри вікна. Аналогічно як в С++
mov wc.style, WS_VISIBLE or WS_SYSMENU or WS_MINIMIZEBOX
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground, COLOR_WINDOW + 1
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, OFFSET ClassName
invoke LoadIcon, NULL, IDI_APPLICATION
mov wc.hIcon, eax
mov wc.hIconSm, eax
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, eax
invoke RegisterClassEx, addr wc ; реєструємо клас вікна
invoke CreateWindowEx, NULL,\
ADDR ClassName,\
ADDR AppName,\
WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
NULL,\
NULL,\
hInst,\
NULL
mov hwnd, eax
@SetWndSize hwnd, 700, 600
invoke ShowWindow, hwnd, CmdShow ; показати вікно
invoke UpdateWindow, hwnd ; оновлення області вікна
.WHILE TRUE ; безкінечний цикл :D (обробка подій)
invoke GetMessage, ADDR msg, NULL, 0, 0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW ; кінець циклу
mov eax, msg.wParam ; вертаємо код виходу
ret ; вихід в батьківську процедуру
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL hfont:HFONT
switch uMsg
case WM_DESTROY ; якщо закрили вікно
invoke PostQuitMessage, NULL ; тоді вихід з програми
case WM_PAINT ; малюємо
invoke BeginPaint, hWnd, ADDR ps
mov hdc, eax
;invoke Rectangle, hdc, 10, 10, (GetClientRect), 260
invoke EndPaint, hWnd, ADDR ps
default
invoke DefWindowProc, hWnd, uMsg, wParam, lParam ; Обробка повідомлень
ret ; вихід в батьківську процедуру
endsw
xor eax, eax ; всегда возвращаем 0
ret ; вихід в батьківську процедуру
WndProc endp
end start ; кінець програми