include masm32 include masm32rt inc підключаємо магію MASM32 windows k

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
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 ; кінець програми