
- •Idi_application equ 32512
- •Idc_cross equ 32515
- •X word ?
- •Invoke Sleep, 5000
- •X word ?
- •Idi_application equ 32512
- •Idc_cross equ 32515
- •X dword ?
- •Xm dword ?
- •Xp dword ?
- •Idi_icon1 icon "calculator.Ico"
- •Idi_bit1 bitmap "picture1.Bmp"
- •Idi_bit2 bitmap "picture2.Bmp"
- •Idi_icon1 icon "calculator.Ico"
- •Xm dword ?
- •Xp dword ?
- •Idi_icon1 icon "calculator.Ico"
- •Vk_f5, 4, virtkey, alt
- •Xm dword ?
- •Xp dword ?
Idi_application equ 32512
;ідентифікатор курсору
Idc_cross equ 32515
;режим показу вікна — нормальний
SW_SHOWNORMAL equ 1
HS_DIAGCROSS equ 5
PS_DASHDOT equ 3
RGBW equ (0 or (100 shl 8)) or (60 shl 16)
RGBR equ 80
RGBL equ 0
RGBP equ 250 or (100 shl 8)
RGBS equ (160 or (70 shl 8)) or (100 shl 16)
;прототипи зовнішніх процедур
EXTERN CreateWindowExA@48:NEAR
…
;структури
MSGSTRUCT STRUC
MSHWND DD ?;ідентифікатор вікна, що отримує ;повідомлення
MSMESSAGE DD ? ;ідентифікатор повідомлення
MSWPARAM DD ? ;додаткова інформація про повідомлення
MSLPARAM DD ? ;додаткова інформація про повідомлення
MSTIME DD ? ;час посилання повідомлення
MSPT DD ?;положення курсору, під час посилання ;повідомлення
MSGSTRUCT ENDS
WNDCLASS STRUC
CLSSTYLE DD ? ;стиль вікна
CLWNDPROC DD ? ;вказівник на процедуру вікна
CLSCEXTRA DD ? ;інформація про додаткові байти для даної ;структури
CLWNDEXTRA DD ? ;інформація про додаткові байти для вікна
CLSHINSTANCE DD ? ;дескриптор додатка
CLSHICON DD ? ;ідентифікатор ікони вікна
CLSHCURSOR DD ? ;ідентифікатор курсору вікна
CLBKGROUND DD ? ;ідентифікатор пензля вікна
CLMENUNAME DD ? ;ім’я-ідентифікатор меню
CLNAME DD ? ;специфікує ім'я класу вікон
WNDCLASS ENDS
PAINTSTR STRUC
hdc DD 0
fErase DD 0
left DD 0
top DD 0
right DD 0
bottom DD 0
fRes DD 0
fIncUp DD 0
Reserv DB 32 dup(0)
PAINTSTR ENDS
RECT STRUC
L DWORD ? ;X - левого верхнего угла.
T DWORD ? ;Y - левого верхнего угла.
R DWORD ? ;Х - правого нижнего угла.
B DWORD ? ;Y - правого нижнего угла.
RECT ENDS
POINT STRUCT
X dword ?
Y DWORD ?
POINT ENDS
;сегмент даних
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
NEWHWND DD 0
MSG MSGSTRUCT <?>
WC WNDCLASS <?>
RC RECT <?>
PNT PAINTSTR <?>
pPoint POINT <?>
HINST DD 0 ;дескриптор додатку
TITLENAME DB 'Малюнки', 0
CLASSNAME DB 'CLASS32', 0
CAP DB 'Повідомлення', 0
MES1 DB 'Ви натиснули ліву кнопку мишки', 0
MES2 DB 'Вихід з програми', 0
HDC DWORD ?
MEMDC DWORD ?
YM DWORD ?
Xm dword ?
P DWORD 0
Xp dword ?
YP DWORD ?
HBMP DWORD ?
HPEN DWORD ?
HBRUSH DWORD ?
HBRUSH1 DWORD ?
HBRUSH2 DWORD ?
HBRUSH3 DWORD ?
_DATA ENDS
; сегмент коду
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
START:
;отримати дескриптор додатку
PUSH 0
CALL GetModuleHandleA@4
MOV [HINST], EAX
REG_CLASS:
;заповнити структуру вікна
;стиль вікна
MOV [WC.CLSSTYLE], style
;процедура обробки повідомлень
MOV [WC.CLWNDPROC], OFFSET WNDPROC
MOV [WC.CLSCEXTRA], 0
MOV [WC.CLWNDEXTRA], 0
MOV EAX, [HINST]
MOV [WC.CLSHINSTANCE], EAX
;піктограма вікна
PUSH 1
PUSH [HINST]
CALL LoadIconA@8
MOV [WC.CLSHICON] , EAX
;курсор вікна
PUSH IDC_CROSS
PUSH 0
CALL LoadCursorA@8
MOV [WC.CLSHCURSOR], EAX
PUSH RGBW ;колір пензля
CALL CreateSolidBrush@4 ;створити пензель
MOV [WC.CLBKGROUND], 17
MOV DWORD PTR [WC.CLMENUNAME],0
MOV DWORD PTR [WC.CLNAME], OFFSET CLASSNAME
PUSH OFFSET WC
CALL RegisterClassA@4
;створити вікно зареєстрованого класу
PUSH 0
PUSH [HINST]
PUSH 0
PUSH 0
PUSH 480 ; DY - висота вікна
PUSH 640 ; DX - ширина вікна
PUSH 100 ; Y — координата лівого верхнього кута
PUSH 100 ; X — координата лівого верхнього кута
PUSH WS_OVERLAPPEDWINDOW
PUSH OFFSET TITLENAME ;ім’я вікна
PUSH OFFSET CLASSNAME ;ім’я класу
PUSH 0
CALL CreateWindowExA@48
; перевірка на помилку
CMP EAX,0
JZ _ERR
MOV [NEWHWND], EAX ;дескриптор вікна
;----------------------------------
PUSH SW_SHOWNORMAL
PUSH [NEWHWND]
CALL ShowWindow@8 ;показати створене вікно
;----------------------------------
PUSH [NEWHWND]
CALL UpdateWindow@4 ;команда перемалювати видиму частину ;вікна, повідомлення WM_PAINT
;цикл обробки повідомлень
MSG_LOOP:
PUSH 0
PUSH 0
PUSH 0
PUSH OFFSET MSG
CALL GetMessageA@16
CMP EAX, 0
JE END_LOOP
PUSH OFFSET MSG
CALL TranslateMessage@4
PUSH OFFSET MSG
CALL DispatchMessageA@4
JMP MSG_LOOP
END_LOOP:
;вихід із програми (закрити процес)
PUSH [MSG.MSWPARAM]
CALL ExitProcess@4
_ERR:
JMP END_LOOP
;------------------------------------------------------------
; процедура вікна
; розташування параметрів у стеку
; [EBP+14H] LPARAM
; [EBP+10H] WPARAM
; [EBP+0CH] MES
; [EBP+8Н] HWND
WNDPROC PROC
PUSH EBP
MOV EBP, ESP
PUSH EBX
PUSH ESI
PUSH EDI
CMP DWORD PTR [EBP+0CH], WM_DESTROY
JE WMDESTROY
CMP DWORD PTR [EBP+0CH], WM_COMMAND
JE WMCOMMAND
CMP DWORD PTR [EBP+0CH], WM_CREATE
JE WMCREATE
CMP DWORD PTR [EBP+0CH], WM_PAINT
JE WMPAINT
CMP DWORD PTR [EBP+0CH],WM_LBUTTONDOWN
JE LBUTTON
CMP DWORD PTR [EBP+0CH],WM_RBUTTONDOWN
JE RBUTTON
JMP DEFWNDPROC
;натиснення правої кнопки приводить до закриття вікна додатку
RBUTTON:
JMP WMDESTROY
;натиснення лівої кнопки приводить до появи вікна повідомлення
WMPAINT:
PUSH OFFSET PNT
PUSH DWORD PTR [EBP+08H]
CALL BeginPaint@8
MOV HDC, EAX ;зберегти контекст (дескриптор) скопіювати віртуальне вікно на реальне
PUSH 0CC0020h ;SRCCOPY=скопіювати зображення як воно є
PUSH 0 ;y-джерела
PUSH 0 ;x-джерела
PUSH MEMDC ;контекст джерела
PUSH YM ;висота - куди
PUSH XM ;ширина - куди
PUSH 0 ;y-куди
PUSH 0 ;x-куди
PUSH HDC ;контекст - куди
CALL BitBlt@36
;закрити контекст вікна
PUSH OFFSET PNT
PUSH DWORD PTR [EBP+08H]
CALL EndPaint@8
MOV EAX, 0
JMP FINISH
LBUTTON:
JMP FINISH
WMCREATE:
;розміри екрану
PUSH 0 ;X
CALL GetSystemMetrics@4
MOV XM,EAX
PUSH 1 ;Y
CALL GetSystemMetrics@4
MOV YM,EAX
;відкрити контекст вікна
PUSH DWORD PTR [EBP+08H]
CALL GetDC@4
MOV HDC,EAX
;створити сумісний з даним вікном контекст
PUSH EAX
CALL CreateCompatibleDC@4
MOV MEMDC,EAX
;створити в пам’яті растрове зображення сумісне з HDC
PUSH YM
PUSH XM
PUSH HDC
CALL CreateCompatibleBitmap@12
PUSH 0
PUSH 3
PUSH 2
PUSH 0
PUSH 0
PUSH [EBP+08H]
CALL BmpButton@24
MOV HBMP, EAX
;знищити контекст
PUSH HDC
PUSH DWORD PTR [EBP+08H]
CALL ReleaseDC@8
MOV EAX, 0
JMP FINISH
WMCOMMAND:
; MOV EAX, [EBP+14H]
; CMP EAX, HBMP
; JE WMDESTROY
DEFWNDPROC:
PUSH DWORD PTR [EBP+14H]
PUSH DWORD PTR [EBP+10H]
PUSH DWORD PTR [EBP+0CH]
PUSH DWORD PTR [EBP+08H]
CALL DefWindowProcA@16
JMP FINISH
WMDESTROY:
;видалити перо
PUSH HPEN
CALL DeleteDC@4
;видалити пензель
PUSH HBRUSH
CALL DeleteDC@4
;видалити віртуальне вікно
PUSH MEMDC
CALL DeleteDC@4
PUSH 0
CALL PostQuitMessage@4 ;повідомлення WM_QUIT
MOV EAX, 0
FINISH:
POP EDI
POP ESI
POP EBX
POP EBP
RET 16
WNDPROC ENDP
_TEXT ENDS
END START
#define IDI_ICON1 1