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 ; кінець програми