Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Звіт по Лаб. №5.doc
Скачиваний:
7
Добавлен:
27.11.2019
Размер:
165.38 Кб
Скачать

Результат виконання програми

SysAnimate32+Edit

Текст програми

.386

.model flat,STDCALL

extrn InitCommonControls:Proc, GetModuleHandleA:Proc, ExitProcess:Proc

extrn CreateWindowExA:Proc, RegisterClassA:Proc, GetMessageA:Proc

extrn DispatchMessageA:Proc, DefWindowProcA:Proc, _wsprintfA:Proc

extrn GetDC:Proc, SelectObject:Proc, ReleaseDC:Proc, CreateSolidBrush:Proc

extrn Rectangle:Proc, TextOutA:Proc,SendMessageA:Proc, lstrlen:Proc

extrn DeleteObject:Proc, TranslateMessage:Proc

WS_CHILD EQU 40000000h

WS_POPUP EQU 80000000h

WS_VISIBLE EQU 010000000h

WS_CLIPCHILDREN equ 2000000h

WS_DLGFRAME EQU 400000h

WM_KEYDOWN EQU 100h

WM_KEYUP equ 101h

TBS_TOP EQU 0004h

WM_NOTIFY EQU 4Eh

WM_HSCROLL EQU 114h

TBM_SETRANGE EQU 1030

ACS_AUTOPLAY equ 0004h

WM_USER equ 400h

ACM_OPEN equ WM_USER+100

ACM_PLAY equ WM_USER+101

WM_GETTEXT equ 0Dh

WM_CHAR equ 102h

ES_CENTER equ 1h

ES_MULTILINE equ 4h

EM_GETLINE equ 0C4h

WM_PAINT equ 0Fh

WS_DLGFRAME equ 400000h

;=================================================

.data

WC dd 4003h,offset WndProc,5 dup(0),1,0,offset WndClassName

msg dd 0

msMESSAGE dd 0

msWPARAM dd 0,0,0,0,0

AppHWnd dd 0

MainHWnd dd 0

CHILD_CLASS_NAME db 'msctls_trackbar32',0

CHILD_SYSANIMATE_NAME db 'SysAnimate32',0

CHILD_EDIT_NAME db 'Edit',0

WndClassName db "ABBA",0

FILE_Name db "den2.AVI",0

COLOR dd 0

Brush dd 0

HDC dd 0

TRACK_ID dd 0

TRACK_ID1 dd 0

FORMAT db 'Колiр = %X',0

PRINT_BUF db 20 dup(0)

Buf_Edit db 64 dup(?)

hedit dd ?

;=================================================

.code

Start:

Include Lab_5.inc

call GetModuleHandleA,0 ; отримати хендл програми для створення вікна;

mov AppHWnd,eax

call RegisterClassA,offset WC ; зареєструвати новий клас вікон;

call CreateWindowExA,0,eax,0,WS_POPUP or WS_VISIBLE or WS_DLGFRAME or WS_CLIPCHILDREN, 100,50,400,410,0,0,AppHWnd,0

mov MainHWnd,eax

call SendMessageA,eax,TBM_SETRANGE,1,255*10000h

call CreateWindowExA,0,offset CHILD_SYSANIMATE_NAME,0,WS_CHILD or WS_VISIBLE or ACS_AUTOPLAY, 0,0,50,35,MainHWnd,0,AppHWnd,0

call SendMessageA,eax,ACM_OPEN,0,offset FILE_Name

call CreateWindowExA,0,offset CHILD_EDIT_NAME,0,WS_CHILD or WS_VISIBLE or WS_DLGFRAME or ES_CENTER or ES_MULTILINE, 260,0,140,70,MainHWnd,0,AppHWnd,0

mov hedit, eax

;call SendMessageA,eax,EM_GETLINE,0,offset Buf_Edit

call CreateWindowExA,0,offset CHILD_CLASS_NAME,0,WS_CHILD or WS_VISIBLE or TBS_TOP, 5,360,380,35,MainHWnd,0,AppHWnd,0

call SendMessageA,eax,TBM_SETRANGE,1,255*10000h

call CreateWindowExA,0,offset CHILD_CLASS_NAME,0,WS_CHILD or WS_VISIBLE or TBS_TOP, 5,320,380,35,MainHWnd,1,AppHWnd,0

call SendMessageA,eax,TBM_SETRANGE,1,255*10000h

call CreateWindowExA,0,offset CHILD_CLASS_NAME,0,WS_CHILD or WS_VISIBLE or TBS_TOP, 5,280,380,35,MainHWnd,2,AppHWnd,0

call SendMessageA,eax,TBM_SETRANGE,1,255*10000h

;=================================================

msg_loop: call GetMessageA,offset msg,MainHWnd,0,0

cmp eax, -1

jz STOP

cmp msMESSAGE,WM_KEYUP ; Повідомлення клавіатури

jnz CONTINUE_LOOP

Call SendMessageA, hedit, WM_GETTEXT, 64, offset Buf_Edit

Call SendMessageA, MainHWnd, WM_PAINT, 0, 0

cmp msWPARAM,1bh ; якщо код <ESC>, то STOP

jz STOP

CONTINUE_LOOP:

Call TranslateMessage, offset msg

Call DispatchMessageA,offset msg

Jmp msg_loop

STOP: call ExitProcess,0

;=================================================

WndProc proc hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD

cmp wmsg, WM_PAINT

jz PAINT1

cmp wmsg, WM_KEYDOWN

jz PAINT1

Cmp wmsg,WM_NOTIFY ; WM_NOTIFY надходить від кожного

Jnz NO_NOTIFY ; дочірнього вікна, при тому

Mov eax,wparam ; wparam містить ідентифікатор

Xchg eax,TRACK_ID1 ; дочірнього вікна від якого надійшло

Xchg eax,TRACK_ID ; повідомлення, який записуємо у TRACK_ID;

NO_NOTIFY: cmp wmsg,WM_HSCROLL ; WM_HSCROLL надходить від

Jnz NO_CHILD ; вікон типу “горизонтальний скролінг”

Mov eax,wparam ; молодша частина wparam – дія,

Shr eax,16 ; старша частина – позиція ковзуна;

Jz NO_CHILD ; якщо позиція = 0, то вийти з процедури;

Mov ebx,TRACK_ID ; TRACK_ID – поточний ідентифікатор, а

Cmp ebx,TRACK_ID1 ; TRACK_ID1 – попередній ідентифікатор

Jnz NO_CHILD ; дочірнього вікна, які повинні співпадати;

Add ebx,offset COLOR ; ідентифікатор використовується

Mov [ebx],al ; як індекс кольору;

Call DeleteObject, Brush ;видаляємо кисть

Call CreateSolidBrush,COLOR ; створюється кисть заданого кольору

Mov Brush,eax ; записати хендл кисті;

PAINT1: Call GetDC, hwnd ; одержуємо графічний контекст

Mov HDC,eax ; вікна і зберігаємо його;

;Call SendMessageA, MainHWnd, WM_GETTEXT, 64, offset Buf_Edit

Call SelectObject,HDC,Brush ; змінюємо поточну кисть;

Call Rectangle,HDC,0,0,400,270 ; малюємо прямокутник

call SelectObject,HDC,hFont

call SetTextColor,HDC,0022FFh

call SetBkColor,HDC,00FFFFh

Call _wsprintfA, offset PRINT_BUF,offset FORMAT,COLOR

Add esp,4*3 ; необхідно лише для _wsprintfA;

Call lstrlen,offset PRINT_BUF ; отримуємо довжину рядка

Call TextOutA, HDC, X_coord, Y_coord, offset PRINT_BUF, eax

;Call SendMessageA, hedit, WM_GETTEXT, 64, offset Buf_Edit

Call lstrlen, offset Buf_Edit

Call TextOutA, HDC, 20, 140, offset Buf_Edit, eax

Call ReleaseDC,hwnd,HDC ; звільняємо графічний контекст;

NO_CHILD: ; мітка виходу з процедури;

Call DefWindowProcA,hwnd,wmsg,wparam,lparam ; стандартний вихід,

Ret ; повернення з процедури;

WndProc endp

End Start