include \masm32\include\masm32rt.inc ; підключаємо "магію" MASM32 (windows, kernel32, user32, gdi32, світчкейси і інші класні макроси) WinMain proto :DWORD,:DWORD,:DWORD,:DWORD ; прототип процедури WinMain .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, CS_HREDRAW or CS_VREDRAW 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 and not WS_THICKFRAME and not WS_MAXIMIZEBOX,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ 800,\ 600,\ NULL,\ NULL,\ hInst,\ NULL mov hwnd, eax 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 rc:RECT ; координати області для малювання LOCAL rect1:RECT ; координати рамки switch uMsg case WM_DESTROY ; якщо закрили вікно invoke PostQuitMessage, NULL ; тоді вихід з програми case WM_PAINT ; малюємо invoke BeginPaint, hWnd, ADDR ps mov hdc, eax invoke GetClientRect, hWnd, ADDR rc mov rect1.top, 10 mov rect1.left, 10 push eax mov eax, rc.right sub eax, 10 mov rect1.right, eax mov eax, rc.bottom sub eax, 10 mov rect1.bottom, eax pop eax invoke Rectangle, hdc, rect1.left, rect1.top, rect1.right, rect1.bottom invoke Rectangle, hdc, 100, 250, 650, 550 invoke Rectangle, hdc, 480, 350, 630, 540 invoke Rectangle, hdc, 120, 320, 450, 470 invoke MoveToEx, hdc, 285, 320, NULL invoke LineTo, hdc, 285, 470 invoke MoveToEx, hdc, 120, 395, NULL invoke LineTo, hdc, 450, 395 invoke MoveToEx, hdc, 100, 250, NULL invoke LineTo, hdc, 375, 50 invoke MoveToEx, hdc, 375, 50, NULL invoke LineTo, hdc, 650, 250 invoke EndPaint, hWnd, ADDR ps default invoke DefWindowProc, hWnd, uMsg, wParam, lParam ; Обробка повідомлень ret ; вихід в батьківську процедуру endsw xor eax, eax ; 0 ret ; вихід в батьківську процедуру WndProc endp end start ; кінець програми