МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет "Львівська політехніка"
Інститут післядипломної освіти
Кафедра АСУ
Лабораторні роботи
з дисципліни " Системне програмування та операційні системи "
Лабораторна робота №1
Тема – введення в програмування за допомогою API.
Мета – навчитися використовувати функції Win32 API при програмуванні в операційній системі Windows.
Порядок виконання роботи:
Замінити виклик функції API GetComputerNameA на виклик однієї з наступних функцій, змінивши відповідним чином параметри:
GetUserNameA, GetWindowsDirectoryA, GetSystemDirectoryA, GetTempPathA, GetCurrentDirectoryA, GetDriveTypeA, після чого відкомпілювати і запустити програму.
.386
.model flat, STDCALL
; Визначення зовнішніх процедур:
extrn ExitProcess :proc ; Ліквідація процесу,
extrn MessageBoxA :proc ; Вивід вікна з повідомленням,
extrn GetUserNameA :proc ; Отримання імені комп’ютера.
.data ; Вміст сегменту даних:
buflen dd 256 ; Визначення комірки пам’яті
hello_title db 'Лаб.роб.№1, Стрільбицький Я.З.', 0
hello_message db 'Ім''я користувача (Get User Name) : ' ; Рядок байтів
user_name db 256 dup (0) ; Буфер заповнений нулями
.code ; Вміст сегменту коду:
Start:
push offset buflen ; 2-й параметр: адреса buflen
push offset user_name ; 1-й параметр: адреса user_name
call GetUserNameA ; виклик функції API
push 40h ; стиль вікна – одна кнопка “OK” з піктограмою “і”
push offset hello_title ; адреса рядка із заголовком
push offset hello_message ; адреса рядка з повідомленням
push 0 ; хендл програми-власника вікна
call MessageBoxA ; виклик функції API
push 0 ; код виходу з програми
call ExitProcess ; завершення програми
end Start ; закінчення сегменту кода
.386
.model flat, STDCALL
; Визначення зовнішніх процедур:
extrn ExitProcess :proc ; Ліквідація процесу,
extrn MessageBoxA :proc ; Вивід вікна з повідомленням,
extrn GetComputerNameA :proc ; Отримання імені комп’ютера.
.data ; Вміст сегменту даних:
buflen dd 256 ; Визначення комірки пам’яті
hello_title db 'Лаб.роб.№1,КН-21,Стрільбицький Я.З.', 0
hello_message db 'І''мя комп''ютера: ' ; Рядок байтів
user_name db 256 dup (0) ; Буфер заповнений нулями
.code ; Вміст сегменту коду:
Start:
push offset buflen ; 2-й параметр: адреса buflen
push offset user_name ; 1-й параметр: адреса user_name
call GetComputerNameA ; виклик функції API
push 40h ; стиль вікна – одна кнопка “OK” з піктограмою “і”
push offset hello_title ; адреса рядка із заголовком
push offset hello_message ; адреса рядка з повідомленням
push 0 ; хендл програми-власника вікна
call MessageBoxA ; виклик функції API
push 0 ; код виходу з програми
call ExitProcess ; завершення програми
end Start ; закінчення сегменту кода
.386 ; Для процесора не нижче INTEL-386
.model flat, STDCALL ; компілювати як програму для WIN32;
; Визначення зовнішніх процедур:
extrn ExitProcess :proc ; Ліквідація процесу,
extrn MessageBoxA :proc ; Вивід вікна з повідомленням,
extrn GetDriveTypeA :proc ; Визначення типу диску.
.data ; Вміст сегменту даних:
buflen dd 256 ; Визначення комірки пам’яті
hello_title db 'Лаб.роб.№1,КН-21, Стрільбицький Я .З.', 0
hello_message db 'Тип логічного диска: ' ; Рядок байтів
user_name db 256 dup (0) ; Буфер заповнений нулями
N1 db "e:\",0
.code ; Вміст сегменту коду:
Start:
call GetDriveTypeA, offset N1
add al,"0"
mov user_name, al
push 40h ; стиль вікна – одна кнопка “OK” з піктограмою “і”
push offset hello_title ; адреса рядка із заголовком
push offset hello_message ; адреса рядка з повідомленням
push 0 ; хендл програми-власника вікна
call MessageBoxA ; виклик функції API
; код виходу з програми
call ExitProcess,0 ; завершення програми
end Start ; закінчення сегменту кода
.386 ; Для процесора не нижче INTEL-386
.model flat, STDCALL ; компілювати як програму для WIN32;
; Визначення зовнішніх процедур:
extrn ExitProcess :proc ; Ліквідація процесу,
extrn MessageBoxA :proc ; Вивід вікна з повідомленням,
extrn GetWindowsDirectoryA :proc ; Отримання імені комп’ютера.
.data ; Вміст сегменту даних:
buflen dd 256 ; Визначення комірки пам’яті
hello_title db 'Лаб.роб.№1 , Стрільбицький Я.З., 0
hello_message db 'Розміщення каталогу Windows: ' ; Рядок байтів
user_name db 256 dup (0) ; Буфер заповнений нулями
.code ; Вміст сегменту коду:
Start:
push offset buflen ; 2-й параметр: адреса buflen
push offset user_name ; 1-й параметр: адреса user_name
call GetWindowsDirectoryA;
push 40h ; стиль вікна – одна кнопка “OK” з піктограмою “і”
push offset hello_title ; адреса рядка із заголовком
.386
.model flat, STDCALL
; Визначення зовнішніх процедур:
extrn ExitProcess :proc ; Ліквідація процесу,
extrn MessageBoxA :proc ; Вивід вікна з повідомленням,
extrn GetUserNameA :proc ; Отримання імені комп’ютера.
.data ; Вміст сегменту даних:
buflen dd 256 ; Визначення комірки пам’яті
hello_title db 'Лаб.роб.№1, Стрільбицький Я.З.
hello_message db 'Ім''я користувача (Get User Name) : ' ; Рядок байтів
user_name db 256 dup (0) ; Буфер заповнений нулями
.code ; Вміст сегменту коду:
Start:
push offset buflen ; 2-й параметр: адреса buflen
push offset user_name ; 1-й параметр: адреса user_name
call GetUserNameA ; виклик функції API
push 40h ; стиль вікна – одна кнопка “OK” з піктограмою “і”
push offset hello_title ; адреса рядка із заголовком
push offset hello_message ; адреса рядка з повідомленням
push 0 ; хендл програми-власника вікна
call MessageBoxA ; виклик функції API
push 0 ; код виходу з програми
call ExitProcess ; завершення програми
end Start ; закінчення сегменту кода
Лабораторна робота №2
Тема – структури даних для використання системних функцій.
Мета – навчитися будувати структури даних для використання функцій Win32 API при програмуванні в операційній системі Windows.
Порядок виконання роботи:
1. Змінити текст програми таким чином, щоб функція API MessageBoxA виводила на екран вікно з двома кнопками: <OK> та <Cancel>. При натисненні кнопки <OK> програма повинна знову отримати системний час, а при натисненні кнопки <Cancel> - програма завершує роботу.
2. Замінити виклик функції API GetLocalTime на виклик однієї з наступних функцій (змінивши відповідним чином параметри): GetSystemTime, DeleteFileA, CopyFileA, RemoveDirectoryA, SetCurrentDirectoryA, SetVolumeLabelA, GetTempFileNameA, SetFileAttributesA, GetFileAttributesA, GetLogicalDrives, GetLogicalDriveStringsA. Для кожної функції додати відповідні дані та команди, якщо вони потрібні.
.386
.model flat,STDCALL
extrn ExitProcess: proc
extrn GetLocalTime: proc
extrn MessageBoxA: proc
extrn _wsprintfA:Proc
.data
Time_title db 'Лаб.роб.№2,КН-21Стрільбицький Я.З.,0
TIME_STRING db 2000 dup (0)
FORMAT_STRING:
db ' Системний час:',0dh,0ah,0dh,0ah
db ' Рiк: %ld',0dh,0ah
db ' Мiсяць: %ld',0dh,0ah
db ' День тижня: %ld',0dh,0ah
db ' Число: %ld',0dh,0ah
db ' Година: %ld',0dh,0ah
db ' Хвилин: %ld',0dh,0ah
db ' Секунда: %ld',0dh,0ah
db ' Мілісекунда: %ld',0dh,0ah
db 0
Time_struc:
wYear dw 0 ; Рік
wMonth dw 0 ; Місяць
wDayOfWeek dw 0 ; День тиждня
wDay dw 0 ; Число
wHour dw 0 ; Година
wMinute dw 0 ; Хвилина
wSecond dw 0 ; Секунда
wMilliseconds dw 0 ; Мілісекунда
;==============================================================
.code
Start: push offset Time_struc
call GetLocalTime
xor eax,eax ; EAX=0
mov ax,wMilliseconds
push eax
mov ax,wSecond
push eax
mov ax,wMinute
push eax ; наступні параметри з стеку не забираються
mov ax,wHour
push eax
mov ax,wDay
push eax
mov ax,wDayOfWeek
push eax
mov ax,wMonth
push eax
mov ax,wYear
push eax
push offset FORMAT_STRING
push offset TIME_STRING
call _wsprintfA ; Вивід параметрів
add esp,4*10 ; та очищення стеку
push 1h
push offset Time_title
push offset TIME_STRING
push 0
call MessageBoxA
cmp eax,1
jz Start
push 0
call ExitProcess
end Start
.386
.model flat,STDCALL
extrn ExitProcess: proc
extrn GetLocalTime: proc
extrn MessageBoxA: proc
extrn GetFileAttributesA:Proc
.data
Time_title db 'Лаб.роб.№2, Стрільбицький Я.З.',0
f1 db "tlink32.exe",0
MAS1 db 40 dup(?)
.code
Start:
call GetFileAttributesA, offset f1
mov esi,offset MAS1
mov ecx,32
M1:
mov dl,"0"
rcl eax,1
adc dl,0
mov [esi],dl
inc esi
dec ecx
jnz M1
call MessageBoxA,0,offset MAS1,offset Time_title,0
call ExitProcess,0
end Start
.386
.model flat,STDCALL
Extrn ExitProcess :Proc
Extrn GetCurrentDirectoryA:Proc
Extrn GetVolumeInformationA:Proc
Extrn _wsprintfA :Proc
Extrn MessageBoxA :Proc
.data
Title1 db 'Лаб.роб.№2, Стрільбицький Я. З.. ',0
VOLUME db 'F:/',0
VOL_LABEL db 16 dup(0)
SERIAL_NUMBER dd 0
FILE_LEN dd 0
VOL_FLAG dd 0
FILESYSTEM db 16 dup(0)
FORMAT db 'Диск: %s',0dh,'Мітка диска: %s',0dh,'Серійний №: %X',0dh,'Файлова система: %s',0
TEXT1 db 260 dup(?)
.code
Start:
call GetVolumeInformationA,offset VOLUME,offset VOL_LABEL,16,offset SERIAL_NUMBER,offset FILE_LEN,offset VOL_FLAG,offset FILESYSTEM,16
call _wsprintfA,offset TEXT1,offset FORMAT,offset VOLUME,offset VOL_LABEL,SERIAL_NUMBER,offset FILESYSTEM
add esp,24
call MessageBoxA,0,offset TEXT1,offset Title1,40h
call ExitProcess,0
end Start
Лабораторна робота №3
Тема – робота з пам’яттю.
Мета – навчитися використовувати системну пам’ять та розміщати в ній дані з файлу.
Порядок виконання роботи:
Доповнити подану програму функцією вибору файлу GetOpenFileNameA (див. довідкову інформацію після програми).
Доповнити отриману програму фрагментом для визначення часу створення та часу останньої модифікації файлу за допомогою функції GetFileTime.
Перетворити час у зручний для сприйняття вигляд за допомогою функції FileTimeToSystemTime та вивести його за допомогою програми попередньої лабораторної роботи. Структуру даних часу time_struc розмістити у виділеному блоці пам’яті.
Після закриття файлу виконати його запуск через оболонку WINDOWS за допомогою команди ShellExecuteA.
.386
.model flat,STDCALL
extrn CreateFileA:Proc
extrn GlobalAlloc:Proc
extrn GlobalLock:Proc
extrn ReadFile:Proc
extrn GetLastError:Proc
extrn MessageBoxA:Proc
extrn CloseHandle:Proc
extrn GlobalUnlock:Proc
extrn GlobalFree:Proc
extrn ExitProcess:Proc
extrn MessageBoxW:Proc
extrn GetOpenFileNameA:Proc
extrn GetCurrentDirectoryA:Proc
extrn GetFileTime:Proc
extrn FileTimeToSystemTime:Proc
.data
title1 db "Лаб.роб.№3,KH-21, Стрільбицький Я.З.",0
openname db '1.TXT',250 dup(0)
hFile dd 0
hMemory dd 0 ; ????? ????? ???’???
pMemory dd 0 ; ?????? ????? ???’???
SizeRead dd 0
MEMSIZE equ 1000000h ; 16 Mb
; – ??????? ??????? ? ????????????, ? ?????????? ????? ?????????? ??????? ???? ??? ?????????
S1:
FSize dd 76 ; ??????? ?i?? ?????????;
Howner dd 0 ; ????i???? ?i???-???????? ??? 0;
AppHWnd dd 0 ; ????i???? ??????-????????;
Filters dd offset filter_tab ; ????i???? ?? ?????i? ???i? ????i?;
CustFilters dd 0 ; ????i???? ?? ?????i? ???i? ????i? ??i ????????i ????????????i;
CstFltSize dd 0 ; ??????? ?????? ?? ???? ?????? CustFilters;
CurFilter dd 2 ; i????? ????????? ?i????? (1,2,3,...) ??? 0;
CurFileName dd offset openname ; ????i???? ?? ????? i?'? ?????, ?????????, ?? “?:\dir1\dir2\file.ext”,0;
CurFlNmSize dd 512 ; ??????? ?????? ????????? ? CurFileName;
CurFile dd 0 ; ????i???? ?? i?'? ????? ? ???????????;
CurFlSize dd 0 ; ??????? ?????? ????????? ? CurFile;
InitialDir dd offset dir ; ????i???? ?? ??????? ????? ??? 0 ??? ?????? ????????;
DlgTitle dd offset titl ; ????i???? ?? ????? ?i???;
Flags dd 00h ; ??? ?i???, ??? ?i??????? ???? (???? ???? 200h);
FileOffset dw 0 ; ???????? ??????? ??????? ?????, ?????????=13 ???? ?????????? ???? ????? “?:\dir1\dir2\file.asm”;
ExtOffset dw 0 ; ??i????? ?i? ??????? ????? ?? ?????????? (? ?????? ???????i =18) ??? 0 ???? ?????????? ?????;
Extension dd 0 ; ????i???? ?? ?????????? ??????????, ??? ???? ?????? ?? i???i, ???? ?????????? ????? (??? 0);
CustData dd 0 ; ????i???? ?? ???i ??? hook-?????????;
HookProc dd 0 ; ????i???? ?? hook-?????????, ???? ???? ????????? ? Flags;
TmplateRsc dd 0 ; ????i???? ?? ?????? ??????i?, ???? ?i? ???????????? ? Flags;
; ????????? ?????? ?? ?????????:
filter_tab db "Графічні файли (*.BMP)",0h,"*.BMP",0
db "Текстові файли (*.TXT)",0,"*.txt",0
db "Лабораторнi роботи (*.ASM)",0,"*.asm",0
db "Всi типи файлiв (*.*)",0h,"*.*",0,0
dir db 260 dup(0)
titl db "Лаб.роб.№3, Стрільбицький Я.З.",0
;-------------------------------------
lpCreationTime dq ?
lpLastAccessTime dq ?
lpLastWriteTime dq ?
;-------------------------------------
.code
Start:
call GetCurrentDirectoryA,260,offset dir
call GetOpenFileNameA,offset S1
push 0
push 0h ; ???? ? ?????????? ??????????
push 4h ; ???????? ???????? ??? ???????? ?????
push 0 ; ??? ????????? ???????
push 1h ; ????????? ???????? ?????? ?? ???????
push 80000000h ; ?????? ????
push offset openname ; ?????? ????? ?????
call CreateFileA
mov hFile,eax ; ???????? ????? ?????
call GetFileTime, hFile, offset lpCreationTime, offset lpLastAccessTime, offset lpLastWriteTime
call FileTimeToSystemTime,offset lpCreationTime, offset Time_struc
call PRINT_TIME
push hFile
call CloseHandle ; ??????? ????
push 0
call ExitProcess ; ?????????? ? Windows
;----------------------------------------
;include GetTime.inc
extrn _wsprintfA:Proc
.data
Time_title db ' Lab3 KH-21, Стрільбицький Я.З.',0
TIME_STRING db 2000 dup (0)
FORMAT_STRING:
db ' System Time:',0dh,0ah,0dh,0ah
db ' Year: %ld',0dh,0ah
db ' Month: %ld',0dh,0ah
db ' Day of Week: %ld',0dh,0ah
db ' Date: %ld',0dh,0ah
db ' Hour: %ld',0dh,0ah
db ' Minute: %ld',0dh,0ah
db 0
Time_struc:
wYear dw 0 ; ???
wMonth dw 0 ; ??????
wDayOfWeek dw 0 ; ???? ??????
wDay dw 0 ; ?????
wHour dw 0 ; ??????
wMinute dw 0 ; ???????
wSecond dw 0 ; ???????
wMilliseconds dw 0 ; ???????????
;==============================================================
.code
PRINT_TIME:
xor eax,eax ; EAX=0
mov ax,wMinute
push eax ; ???????? ????????? ? ????? ?? ???????????
mov ax,wHour
push eax
mov ax,wDay
push eax
mov ax,wDayOfWeek
push eax
mov ax,wMonth
push eax
mov ax,wYear
push eax
push offset FORMAT_STRING
push offset TIME_STRING
call _wsprintfA ; ????? ??????????
add esp,4*8 ; ?? ???????? ?????
push 0h
push offset Time_title
push offset TIME_STRING
push 0
call MessageBoxA
ret
end Start
Лабораторна робота №4
Тема – стандартні класи вікон та їх типи.
Мета – зрозуміти поняття вікна в операційній системі Windows.
Порядок виконання роботи:
Замість стандартного класу Button ввести наступні назви класів:
ComboBox, Edit, ListBox, Message, ScrollBar, Static, SysAnimate32, SysHeader32, SysListView32, SysTabControl32, SysTreeView32, TTSubclass, ToolTips, ToolbarWindow32, msctls_hotkey32, msctls_progress32, msctls_statusbar32, msctls_trackbar32, msctls_updown32, tooltips_class32, #32768, #32769, #32770, #32771, ComboBoxEx32, SysPager, SysIPAddress32, NativeFontCtl.
.386
.model flat,STDCALL
extrn InitCommonControls:Proc
extrn GetModuleHandleA:Proc
extrn ExitProcess:Proc
extrn CreateWindowExA:Proc
extrn GetMessageA:Proc
extrn DispatchMessageA:Proc
extrn TranslateMessage:Proc
; Визначення типів (стилів) вікон:
WS_POPUP equ 80000000h
WS_VISIBLE equ 010000000h
WS_DLGFRAME equ 400000h
WS_EX_TOPMOST equ 8h
; Код повідомлення про натиснуту клавішу:
WM_KEYDOWN equ 100h
.data
MSG: ; Структура стандартного повідомлення WINDOWS
msHWND dd 0 ; хто надіслав
msMESSAGE dd 0 ; яку інформацію
msWPARAM dd 0 ; про що
msLPARAM dd 0 ; і як
msTIME dd 0 ; коли
ptX dd 0 ; де (X),
ptY dd 0 ; (Y)
AppHWnd dd 0
NewHWnd dd 0
WindowCaption db "Лаб.роб.№4, Стрільбицький Я.З ",0
CLASSNAME db 'Button',0 ; Ім’я стандартного класу
;=======================================
.code
Start: call InitCommonControls
push 0h
call GetModuleHandleA
mov AppHWnd,eax
push 0 ; MDI-структура
push AppHWnd ; програмний модуль
push 0 ; меню
push 0 ; власник
push 100 ; висота
push 480 ; ширина
push 250 ; координата y
push 300 ; координата x
push WS_POPUP or WS_VISIBLE or WS_DLGFRAME
push offset WindowCaption ; Заголовок вікна
push offset CLASSNAME ; Ім’я класу вікна
push WS_EX_TOPMOST ; Властивості
call CreateWindowExA ; Створити вікно
mov NewHWnd,eax ; Зберегти хендл вікна
;=======================================
MSG_LOOP: ; Цикл прийому повідомлень
push 0 ; діапазон прийому -
push 0 ; всі можливі повідомлення
push NewHWnd ; від даного вікна
push offset MSG ; Адреса структури повідомлення
call GetMessageA
cmp msMESSAGE,WM_KEYDOWN
jnz CONTINUE_LOOP
cmp msWPARAM,1bh ; код <ESC>
jz STOP
CONTINUE_LOOP:
push offset MSG
call TranslateMessage
push offset MSG ; Направити повідомлення у ві-
call DispatchMessageA ; конну процедуру.
jmp MSG_LOOP
;==============================
STOP:
push 0
call ExitProcess
End Start
.386
.model flat,STDCALL
extrn InitCommonControls:Proc
extrn GetModuleHandleA:Proc
extrn ExitProcess:Proc
extrn CreateWindowExA:Proc
extrn GetMessageA:Proc
extrn DispatchMessageA:Proc
extrn TranslateMessage:Proc
; Визначення типів (стилів) вікон:
WS_POPUP equ 80000000h
WS_VISIBLE equ 010000000h
WS_DLGFRAME equ 400000h
WS_EX_TOPMOST equ 8h
; Код повідомлення про натиснуту клавішу:
WM_KEYDOWN equ 100h
BS_AUTOCHECKBOX equ 3h
.data
MSG: ; Структура стандартного повідомлення WINDOWS
msHWND dd 0 ; хто надіслав
msMESSAGE dd 0 ; яку інформацію
msWPARAM dd 0 ; про що
msLPARAM dd 0 ; і як
msTIME dd 0 ; коли
ptX dd 0 ; де (X),
ptY dd 0 ; (Y)
AppHWnd dd 0
NewHWnd dd 0
WindowCaption db " Стрільбицький Я.З.",0
CLASSNAME db 'Button',0 ; Ім’я стандартного класу
;=======================================
.code
Start: call InitCommonControls
push 0h
call GetModuleHandleA
mov AppHWnd,eax
push 0 ; MDI-структура
push AppHWnd ; програмний модуль
push 0 ; меню
push 0 ; власник
push 100 ; висота
push 480 ; ширина
push 250 ; координата y
push 300 ; координата x
push WS_POPUP or WS_VISIBLE or WS_DLGFRAME or BS_AUTOCHECKBOX
push offset WindowCaption ; Заголовок вікна
push offset CLASSNAME ; Ім’я класу вікна
push WS_EX_TOPMOST ; Властивості
call CreateWindowExA ; Створити вікно
mov NewHWnd,eax ; Зберегти хендл вікна
;=======================================
MSG_LOOP: ; Цикл прийому повідомлень
push 0 ; діапазон прийому -
push 0 ; всі можливі повідомлення
push NewHWnd ; від даного вікна
push offset MSG ; Адреса структури повідомлення
call GetMessageA
cmp msMESSAGE,WM_KEYDOWN
jnz CONTINUE_LOOP
cmp msWPARAM,1bh ; код <ESC>
jz STOP
CONTINUE_LOOP:
push offset MSG
call TranslateMessage
push offset MSG ; Направити повідомлення у ві-
call DispatchMessageA ; конну процедуру.
jmp MSG_LOOP
;==============================
STOP:
push 0
call ExitProcess
End Start
.386
.model flat,STDCALL
extrn GetModuleHandleA:Proc
extrn ExitProcess:Proc
extrn CreateWindowExA:Proc
extrn DispatchMessageA:Proc
extrn SendMessageA:Proc
extrn PeekMessageA:Proc
extrn TranslateMessage:Proc
WS_POPUP EQU 80000000h
WS_VISIBLE EQU 010000000h
WS_DLGFRAME EQU 400000h
WS_EX_TOPMOST equ 8h
WM_KEYDOWN equ 100h
CB_ADDSTRING equ 143h
CBS_DROPDOWN equ 2h
CBS_HASSTRINGS equ 200h
CBS_SORT equ 100h
PM_REMOVE equ 1h
;===============================================================
.data
msg: ; структура повiдомлення
msHWND dd 0
msMESSAGE dd 0
msWPARAM dd 0
msLPARAM dd 0
msTIME dd 0
ptX dd 0
ptY dd 0
AppHWnd dd 0 ; хендл завантаженої програми
NewHWnd dd 0 ; хендл кнопки
CLASSNAME db 'ComboBox',0
STR1 db "Лаб.роб.№4, Чопко Я.О.",0
STR2 db "рядок 2",0
;================================================================
.code
Start:
push 0h
call GetModuleHandleA
mov AppHWnd,eax
push 0
push AppHWnd ; hInstance
push 0 ; menu
push 0 ; parent hwnd
push 60 ; розмiр по вертикалi
push 480 ; розмiр по горизонталi
push 250 ; координата y
push 300 ; координата x
push WS_POPUP or WS_VISIBLE or WS_DLGFRAME \
or CBS_SORT or CBS_DROPDOWN or CBS_HASSTRINGS
push 0 ; назва вiкна
push offset CLASSNAME
push WS_EX_TOPMOST ; поверх всiх вiкон
call CreateWindowExA
mov NewHWnd,eax
call SendMessageA,NewHWnd,CB_ADDSTRING,0,offset STR1
call SendMessageA,NewHWnd,CB_ADDSTRING,0,offset STR2
;====================================================
MSG_LOOP:
call PeekMessageA,offset msg,NewHWnd, 0h,0, PM_REMOVE
or eax,eax
jnz MESS_OK
call PeekMessageA,offset msg,0, 201h,202h, PM_REMOVE
or eax,eax
jz MSG_LOOP
MESS_OK:
cmp msMESSAGE,WM_KEYDOWN ; якщо це повiдомлення про натиснену клавiшу,
jnz CONTINUE_LOOP
cmp msWPARAM,1bh ; якщо її код = <ESC>, то STOP
jz STOP
CONTINUE_LOOP:
call TranslateMessage,offset msg
call DispatchMessageA,offset msg ; обробити повiдомлення
jmp MSG_LOOP
;==============================
STOP:
push 0
call ExitProcess
End Start
Лабораторна робота №5
Тема – Дочірні вікна: їх утворення та взаємодія, графічний контекст.
Мета – навчитись будувати ієрархічну структуру вікон та працювати з ними.
Порядок виконання роботи:
Переробити першу програму таким чином, щоб вона мала три дочірніх вікна класу msctls_trackbar32, кожне з яких регулюватиме один з кольорів: червоний, зелений, синій.
Переробити програму так, щоб текст, який виводить значення кольору, виводився шрифтом “Comic Sans MS”. Створення гарнітури шрифту зробити перед створенням вікна.
Ввести в програму дочірнє вікно класу SysAnimate32 з стилем ACS_AUTOPLAY. Після створення вікна цього стилю надіслати йому повідомлення ACM_OPEN та ACM_PLAY. Формат повідомлень знайти в Win32.hlp.
Ввести в програму дочірнє вікно класу Edit з стилями ES_CENTER та ES_MULTILINE. За допомогою повідомлення EM_GETLINE переписати в буфер введену інформацію та вивести її за допомогою функції MessageBoxA. Для коректної роботи програми з вікном класу Edit в цикл прийому повідомлень вставити функцію TranslateMessage.
Створити в основній програмі таймер за допомогою функції SetTimer, який буде щосекунди надсилати повідомлення WM_TIMER у процедуру основного вікна. З приходом кожного такого повідомлення у процедурі вікна збільшувати змінну-лічильник і надсилати її текстове значення у дочірнє вікно класу Edit за допомогою повідомлення WM_SETTEXT.
.586
.model flat,stdcall
Extrn CreateFontIndirectA:Proc, GetDC:Proc, SelectObject:Proc, SetTextColor:Proc
Extrn SetBkColor:Proc, TextOutW:Proc, ReleaseDC:Proc, ExitProcess:Proc, TextOutA:Proc
.data
HDC dd 0
LOGFONTA:
lfHeight DD 70 ; ??????
lfWidth DD 20 ; ??????
lfEscapement DD 0 ; ??? ?????? * 10
lfOrientation DD 0 ;
lfWeight DD 1000 ; ????i??? (1000-Bold)
lfItalic DB 1 ; ??????
lfUnderline DB 0 ; ?i??????????
lfStrikeOut DB 0
lfCharSet DB 1 ; 255 – ?????? DOS
lfOutPrecision DB 0
lfClipPrecision DB 0
lfQuality DB 1
lfPitchAndFamily DB 0
lfFaceName DB 'Times New Roman' ; ????? ?????
Reserv DB 32-6 dup(0)
X_coord dd 80
Y_coord dd 80
Text1:
DB ' Чопко Я.О ' ; ?????????????
db ' ',0,'r',0,'o',0,'g',0,'r',0,'a',0,'m',0
EndText1 db 0
Text2:
DB "Лабораторна робота №5"
EndText2 db 0
.code
Start: call GetDC,0
mov HDC,eax
call CreateFontIndirectA, offset LOGFONTA
call SelectObject,HDC,eax
call SetTextColor,HDC,0022FFh
call SetBkColor,HDC,00FFFFh
mov eax,offset EndText2 ; ANSI
sub eax,offset Text2
call TextOutA,