Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsiyi.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
188.29 Кб
Скачать

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]