Міністерство освіти та науки України
Національний університет “Львівська політехніка”
Кафедра автоматизованих систем управління
Звіт
з предмету
“Системне програмування і операційні системи”
з лабораторної роботи №5
Підготував:
студент групи КН-21
Славич Юрій
Перевірила:
Павлюк О.М.
Львів - 2011
Лабораторна робота №5
Тема – Дочірні вікна: їх утворення та взаємодія, графічний контекст.
Мета – Навчитись будувати ієрархічну структуру вікон та працювати з ними.
Теоретичні відомості
InitCommonControls функція гарантує, що завантажений спільним контролем динамічну бібліотеку (DLL).
Пустота InitCommonControls (void);
GetModuleHandle повертає модуля ручку для вказаний модуль, якщо файл був відображаються в адресному просторі викликає процесу.
HMODULE GetModuleHandle
LPCTSTR lpModuleName / / адреса імені модуля, щоб повернутися ручка для
ExitProcess завершує процес і всі його потоки.
VOID ExitProcess
UINT uExitCode / / код виходу для всіх потоків
CreateWindowEx створює перекриваються, спливаюче або дочірнє вікно з розширеною стилю, в іншому випадку ця функція збігається з функцією CreateWindow. Для отримання додаткової інформації про створення вікна та повні описи інших параметрів CreateWindowEx см. CreateWindow.
HWND CreateWindowEx
DwExStyle DWORD, / / Extended стиль вікна
LPCTSTR lpClassName, / / вказівник на ім'я класу зареєстровано
LPCTSTR lpWindowName, / / вказівник на ім'я вікна
DwStyle DWORD, / / стиль вікна
Int X, / / горизонтальне положення вікна
Int Y, / / вертикальне положення вікна
Int nWidth, / / Ширина вікна
Int nHeight, / / висота вікна
HWndParent HWND, / / дескриптор з батьків або власника вікна
HMENU HMenu, / / дескриптор меню, або дитину-вікна ідентифікатора
HINSTANCE HINSTANCE, / / дескриптор екземпляра програми
LPVOID lpParam / / покажчик на вікно даних для створення
RegisterClass регістри функцій класу вікна для подальшого використання при дзвінках на CreateWindow або CreateWindowEx функції.
RegisterClass функція була замінена функцією RegisterClassEx. Ви все ще можете використовувати RegisterClass, проте, якщо вам не потрібно встановити клас маленький значок.
ATOM RegisterClass (
CONST WNDCLASS / / адресу структури з даними класу
GetMessage отримує повідомлення з викликає черги повідомлень потоку і поміщає його в зазначеній структурі. Ця функція може стати і повідомлення, пов'язані із зазначеною вікна і потік повідомлень, відправлених через PostThreadMessage функції. Функція повертає повідомлення, які знаходяться в межах зазначеного діапазону значень повідомленні. GetMessage не отримати повідомлення для вікон, які належать до тих чи інших програм.
BOOL GetMessage
LPMSG lpMsg, / / адреса структури з повідомленням
HWnd HWND, / / дескриптор вікна
UINT wMsgFilterMin, / / Перше повідомлення
UINT wMsgFilterMax / / останні повідомлення
DispatchMessage функція розсилки повідомлень до вікна процедурою. Він звичайно використовується, щоб направити послання витягується GetMessage функції.
LONG DispatchMessage
CONST MSG * lpmsg / / покажчик на структуру з повідомленням
Функція DefWindowProc викликає процедуру вікна за замовчуванням, щоб забезпечити обробки за замовчуванням для будь-якого вікна повідомлень, програма не процес. Ця функція забезпечує обробку кожного повідомлення. DefWindowProc викликається з тими ж параметрами отриманої вікно процедури.
LRESULT DefWindowProc
HWnd HWND, / / дескриптор вікна
UINT Msg, / / ідентифікатор повідомлення
WPARAM wParam, / / перший параметр повідомлення
LPARAM LPARAM / / другий параметр повідомлення
Ця функція одержує загальну, клас чи приватний контекст пристрою, в залежності від класу стилю, зазначеного для вказаного вікна. Для загального контексту пристрою, GetDC замовчуванням присвоює атрибути контексту пристрою кожен раз, коли знайшла його. Для класу і приватних контекстів пристрої, GetDC залишає раніше призначених незмінними атрибутами.
HDC GetDC
HWND HWnd / / дескриптор вікна
Функція SelectObject вибирає об'єкт в зазначеному контексті пристрою. Новий об'єкт замінює попередній об'єкт того ж типу.
HGDIOBJ SelectObject
HDC HDC, / / дескриптор контексту пристрою
HGDIOBJ hgdiobj / / дескриптор об'єкта
Функція ReleaseDC релізи контексті пристрою (DC), звільняючи його для використання іншими додатками. Ефект функції ReleaseDC залежить від типу пристрою зв'язку. Він звільняє тільки загальні і контекстів вікні пристрою. Це не впливає на клас чи приватні контексти пристрою.
Int ReleaseDC
HWnd HWND, / / дескриптор вікна
HDC ЬВС / / дескриптор контексту пристрою
Функція CreateSolidBrush створює логічні щітку, який вказаний суцільний колір.
HBRUSH CreateSolidBrush (
COLORREF crColor / / щітка значення кольору
Функція Rectangle малює прямокутник прямокутника. Прямокутник викладається з використанням поточного пера і заповнити за допомогою поточної кисті.
BOOL Прямокутник
HDC HDC, / / дескриптор контексту пристрою
Int nLeftRect, / / X-коорд. обмежує прямокутника верхньому лівому куті
Int nTopRect, / / Y-коорд. обмежує прямокутника верхньому лівому куті
Int nRightRect, / / X-коорд. обмежує прямокутник в нижньому правому куті
Int nBottomRect / / Y-коорд. обмежує прямокутник в нижньому правому куті
Функція TextOut записує рядок символів у вказаному місці, з використанням вибраного шрифту.
BOOL TextOut
HDC HDC, / / дескриптор контексту пристрою
Int nXStart, / / X-координата стартову позицію
Int nYStart, / / Y-координата стартову позицію
LPCTSTR lpString, / / адреса рядка
Int cbString / / кількість символів у рядку
Функція SendMessage відправляє повідомлення для зазначеного вікна або вікна. Функція викликається вікно процедура для зазначеного вікна і не повертається до вікна процедура оброблених повідомлень. PostMessage функції, на відміну від посади повідомлення до повідомлення потоку черзі і відразу ж повертається.
LRESULT SendMessage
HWnd HWND, / / дескриптор вікна призначення
UINT Msg, / / Відправити повідомлення
WPARAM wParam, / / перший параметр повідомлення
LPARAM LPARAM / / другий параметр повідомлення
Lstrlen функція повертає довжину в байтах (ANSI версії) або символів (Unicode версії) зазначеної рядку (не включаючи нульовий символ).
Int lstrlen
LPCTSTR lpString / / адреса рядка в кол –
CreateFontIndirect функція створює логічного шрифту, який має характеристики, зазначені у зазначеній структурі. Шрифт в подальшому може бути встановлений як поточний шрифт для будь-якого мобільного пристрою зв'язку.
HFONT CreateFontIndirect
CONST LOGFONT lplf * / / покажчик на логічну структуру шрифту
Функція DeleteObject видаляє логічне перо, пензель, шрифт, растрові, регіону або палітру, звільняючи всі системні ресурси, пов'язані з об'єктом. Після того як об'єкт віддаляється, вказаний ручка вже не дійсні.
BOOL DeleteObject
HGDIOBJ hObject / / дескриптор графічного об'єкта
Функція MessageBox створює, відображає і управляє вікні повідомлення. Вікно повідомлень містить додаток певних повідомлень і назви, а також будь-яку комбінацію зумовлених іконок і натискати кнопки.
Int MessageBox
HWnd HWND, / / дескриптор вікна власника
LPCTSTR lpText, / / адреса тексту у вікні повідомлення
LPCTSTR lpCaption, / / адреса Тема повідомлення вікна
UINT uType / / Стиль вікна повідомлення
TranslateMessage функція переводить віртуальних клавіш повідомлень в характері повідомлень. Характер повідомлення будуть відправлені в зухвалу черги повідомлень потоку, який буде читати наступний раз, коли потік викликає GetMessage або PeekMessage функції.
BOOL TranslateMessage
CONST MSG * lpMsg / / адресу структури з повідомленнямSetTimer функція створює таймер з вказаного часу очікування.
UINT SetTimer
HWnd HWND, / / дескриптор вікна по таймеру повідомленнях
UINT nIDEvent, / / ідентифікатор таймера
UINT uElapse, / / тайм-ауту
TIMERPROC lpTimerFunc / / адреса таймера процедура
GetScrollPos функція повертає поточну позицію прокрутки вікна (великий палець) у зазначеній смузі прокручування. Нинішня позиція є відносне значення, яке залежить від поточної прокручування діапазону. Наприклад, при прокручуванні діапазоні від 0 до 100 і прокручування вікна в середині бар, поточна позиція 50.
Int GetScrollPos
HWnd HWND, / / дескриптор вікна зі смугою прокрутки
Int NBAR / / виділити прапорами бару
Функція Sleep призупиняє виконання поточного потоку протягом певного інтервалу.
VOID Sleep
DWORD dwMilliseconds / / сну час в мілісекундах
.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 CreateFontIndirectA:proc, DeleteObject:proc
extrn TranslateMessage:proc, MessageBoxA:proc, SetTimer:proc,GetScrollPos:proc
extrn Sleep:proc
WS_CHILD EQU 40000000h
WS_POPUP EQU 80000000h
WS_VISIBLE EQU 010000000h
WS_DLGFRAME EQU 400000h
WM_KEYDOWN EQU 100h
WM_CTLCOLORSTATIC equ 138h
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
ES_CENTER equ 1h
ES_MULTILINE equ 4h
WM_TIMER equ 113h
WM_SETTEXT equ 0Ch
WM_HSCROLL equ 114h
EM_GETLINE equ 0C4h
TBM_SETPOS equ WM_USER+5
SB_HORZ equ 0
SB_VERT equ 1
SB_CTL equ 2
WM_HSCROLL equ 114h
WM_COMMAND equ 111h
;=====================================================
.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
CLASS_NAME_ANIMATE DB 'SysAnimate32',0
CLASS_NAME_EDIT DB 'Edit',0
Video db 'TEST.avi',0
buf db 255 dup(0)
buf_time db 8 dup(0)
FORMAT_time db '%ld',0
lich_time dd 16
t1 dd 0
H1 dd 0
WndClassName db "ABBA",0
COLOR dd 0
Brush dd 0
HDC dd 0
HEdit dd 0
HTEXT dd 0
HTime dd 0
TRACK_ID dd 0
TRACK_ID1 dd 0
FORMAT db 'Êîëið = %X',0
PRINT_BUF db 20 dup(0)
d dd 1
dx1 dd 10
d1 dd 1
x dd 1280
y dd 585
;=======================================================
.code
Start:
call GetModuleHandleA,0 ; îòðèìàòè õåíäë ïðîãðàìè äëÿ ñòâîðåííÿ â³êíà;
mov AppHWnd,eax
call RegisterClassA,offset WC ; çàðåºñòðóâàòè íîâèé êëàñ â³êîí;
call CreateWindowExA,0,eax,0,WS_POPUP or WS_VISIBLE or WS_DLGFRAME, 0,0,1280,1280,0,0,AppHWnd,0
mov MainHWnd,eax
call CreateWindowExA,0,offset CHILD_CLASS_NAME,0,WS_CHILD or WS_VISIBLE or TBS_TOP, 5,735,1280,35,MainHWnd,0,AppHWnd,0
mov H1,eax
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,695,1280,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,655,1280,35,MainHWnd,2,AppHWnd,0
call SendMessageA,eax,TBM_SETRANGE,1,255*10000h
call CreateWindowExA,0,offset CLASS_NAME_EDIT,0, WS_CHILD or WS_VISIBLE or TBS_TOP or 1h or 4h, 10,600,40,25,MainHWnd,0,AppHWnd,0
mov HTime,eax
call SetTimer,HTime,0,200,0
mov t1,eax
;==========================================================
msg_loop: call GetMessageA,offset msg,MainHWnd,0,0
cmp msMESSAGE,WM_KEYDOWN ; Ïîâ³äîìëåííÿ êëàâ³àòóðè
jnz CONTINUE_LOOP
cmp msWPARAM,1bh ; ÿêùî êîä <ESC>, òî STOP
jz STOP
cmp msWPARAM,EM_GETLINE
jz Message
CONTINUE_LOOP:
call TranslateMessage, offset msg
Call DispatchMessageA,offset msg
cmp msMESSAGE, WM_TIMER
jz Time
Jmp msg_loop
STOP: call ExitProcess,0
Message: call SendMessageA, HEdit,0dh,255,offset buf
call MessageBoxA,0,offset buf,0,40h
jmp msg_loop
Time:
call _wsprintfA,offset buf_time, offset FORMAT_time, lich_time
call SendMessageA,HTime,WM_SETTEXT,0,offset buf_time
add lich_time,64
cmp d,255
jg l1
cmp d,1
jl l1
l2:
mov eax,dx1
add d,eax
call SendMessageA,H1,TBM_SETPOS,1,d
call SendMessageA,MainHWnd,WM_NOTIFY,0,0
mov eax,d
shl eax,16
call SendMessageA,MainHWnd,WM_HSCROLL,eax,eax
jmp msg_loop
l1:
neg dx1
jmp l2
;==========================================================
WndProc proc hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
Cmp wmsg,WM_CTLCOLORSTATIC ; ïåðåìàëüîâóåì â³êíî
Jz PAINT1
; cmp wmsg,WM_HSCROLL
;jnz TMP1
; call MessageBoxA,0,offset CLASS_NAME_ANIMATE,offset CLASS_NAME_ANIMATE,0
; call GetScrollPos,H1,SB_CTL
; mov esi,offset COLOR
; mov [esi],al
TMP1: 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 CreateSolidBrush,COLOR ; ñòâîðþºòüñÿ êèñòü çàäàíîãî êîëüîðó
Mov Brush,eax ; çàïèñàòè õåíäë êèñò³;
PAINT1: Call GetDC, hwnd ; îäåðæóºìî ãðàô³÷íèé êîíòåêñò
Mov HDC,eax ; â³êíà ³ çáåð³ãàºìî éîãî;
Call SelectObject,HDC,Brush ; çì³íþºìî ïîòî÷íó êèñòü;
Call Rectangle,HDC,0,0,x,y ; ìàëþºìî ïðÿìîêóòíèê
dec x
call Sleep,20
dec y
call Sleep,20
cmp x,100
cmp y,100
jz C1
C1:
call SelectObject,HDC,HTEXT
Call _wsprintfA, offset PRINT_BUF,offset FORMAT,COLOR
Add esp,4*3 ; íåîáõ³äíî ëèøå äëÿ _wsprintfA;
Call lstrlen,offset PRINT_BUF ; îòðèìóºìî äîâæèíó ðÿäêà
call TextOutA, HDC, 100,605 , offset PRINT_BUF, eax
call DeleteObject,HTEXT
call ReleaseDC,0,HDC ; çâ³ëüíÿºìî ãðàô³÷íèé êîíòåêñò;
NO_CHILD: ; ì³òêà âèõîäó ç ïðîöåäóðè;
Call DefWindowProcA,hwnd,wmsg,wparam,lparam ; ñòàíäàðòíèé âèõ³ä,
Ret ; ïîâåðíåííÿ ç ïðîöåäóðè;
WndProc endp
End Start
Висновок: під час лабораторної роботи я навчитися будувати ієрархічну структуру вікон.