Стандартні класи вікон та їх типи.

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
КН
Кафедра:
АСУ

Інформація про роботу

Рік:
2015
Тип роботи:
Звіт до лабораторної роботи
Предмет:
Системне програмування

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки України Національний університет “Львівська політехніка” Кафедра АСУ Звіт до лабораторної роботи №4 з курсу « Системного програмування» на тему «Стандартні класи вікон та їх типи.» Тема – стандартні класи вікон та їх типи. Мета – зрозуміти поняття вікна в операційній системі Windows. ТЕОРЕТИЧНІ ПОЛОЖЕННЯ Все, що бачить користувач на екрані в системі WINDOWS є вікном. Вікно – це графічна оболонка, через яку програма може спілкуватися з користувачем. Якщо програмі не потрібно спілкуватись, то вона може і не створювати вікон. Вікно може володіти набором інших вікон, які називаються дочірніми. Кожне вікно має як певний набір параметрів, так і може відрізнятися певною специфікою спілкування з користувачем. Такі специфічні особливості називаються класом вікна. Існують стандартні класи, наприклад, вікно–регулювач, вікно-кнопка, вікно для вводу тексту, вікно-підказка та інші, які ви знайдете в лабораторній роботі. Кожний стандартний клас має унікальну назву, яка дійсна для всіх версій операційних систем WINDOWS. Вікно створюється за допомогою спеціальної функції CreateWindowExA. В параметрах цієї функції вказується наступна інформація: Вказівник на MDI – структуру (або 0); Хендл програми (отримується функцією GetModuleHandle); Хендл меню або дочірнього вікна (або 0); Хендл вікна-власника (або 0); Висота вікна; Ширина вікна; Координата Y; Координата X; Прапорці стилю вікна (див. далі); Вказівник на назву вікна (або 0); Вказівник на назву класу (див. далі); Прапорці властивостей вікна (див. далі). Керувати вікном можна за допомогою внутрішнього механізму WINDOWS, який базується на понятті повідомлення (в програмі позначено WM_...). Отже, вікно – це такий об’єкт WINDOWS, який крім текстово-графічної інформації може отримувати та надсилати спеціальні структури даних, які називаються повідомленнями. Структура кожного повідомлення стандартна і складається з наступних змінних: MsHWND dd 0 ; хендл вiкна, процедура якого отримала повiдомлення; msMESSAGE dd 0 ; код повiдомлення (кожна подiя має свiй); msWPARAM dd 0 ; додатковий параметр 1 (залежить вiд подiї); msLPARAM dd 0 ; додатковий параметр 2 (залежить вiд подiї); msTIME dd 0 ; час, коли було надiслано повiдомлення; ptX dd 0 ; координата X миші, коли надсилалося повiдомлення; ptY dd 0 ; координата Y миші, коли надсилалося повiдомлення. Повідомлення сигналізує про деяку подію в системі або у вікні, наприклад, вичерпався час таймера, користувач натиснув клавішу, відпустив клавішу, порухав мишу, клацнув кнопкою, та інші. Для того, щоб відправити повідомлення до довільного вікна (наприклад, щоб змінити його розмір) необхідно заповнити цю структуру даних та скористуватися функцією SendMessageA, а для прийому повідомлення від певного вікна необхідно вказати діапазон прийому, хендл вікна та адресу структури повідомлення і скористатися функцією GetMessageA. Коли повідомлення надійде, операційна система сама заповнить всі дані структури (див. програму). З кожним стандартним класом вікна зв’язана певна віконна стандартна процедура WndProc, яка малює вікно та обробляє всі повідомлення, що надходять у вікно. Програміст має можливість вставити у віконну процедуру свій фрагмент програми. Такі дії називаються субкласуванням. Саме ідеєю субкласування можна пояснити відокремлення процесів створення вікна, циклу прийому повідомлень та їх обробку у вигляді віконної процедури. Для цього ж кожна віконна процедура отримує параметри через стек за однаковим стандартом незалежно від класу та типу вікна. Цей стандарт не залежить навіть від версії WINDOWS: Hwnd // хендл вікна, яке отримало повідомлення; UMsg // код повідомлення; Wparam // перший параметр повідомлення; Lparam // другий параметр повідомлення; В лабораторній роботі запропонована програма, в якій створюється стандартне вікно класу Button – кнопка, та утворюється цикл прийому повідомлень від цього вікна. В циклі перевіряється подія натиснення клавіші <ESC>. Якщо користувач натиснув <ESC>, то програма закінчується, інакше повідомлення передається у стандартну віконну процедуру. В програмі використана функція GetModuleHandleA, яка необхідна для того, щоб прив’язати вікно до програмного модуля. Завдання: Написати програму для визначення послідовності фібоначі Код: (inc файл) include kernel32.inc include user32.inc include gdi32.inc includelib IMPORT32.LIB .const NULL equ 0 TRUE equ 1 FALSE equ NULL CS_HREDRAW equ 2h CS_VREDRAW equ 1h CW_USEDEFAULT equ 80000000h COLOR_BTNFACE equ 15 IDI_APPLICATION equ 32512 IDC_ARROW equ 32512 ;windows style WS_VISIBLE equ 10000000h WS_CAPTION equ 0C00000h WS_CHILD equ 40000000h WS_SYSMENU equ 80000h WS_THICKFRAME equ 40000h LB_RESETCONTENT equ 184h WS_MINIMIZEBOX equ 20000h WS_MAXIMIZEBOX equ 10000h WS_OVERLAPPEDWINDOW equ WS_VISIBLE or WS_CAPTION\ OR WS_SYSMENU OR WS_THICKFRAME\ OR WS_MINIMIZEBOX OR WS_MAXIMIZEBOX ;Windows Messages WM_DESTROY equ 2h WM_CREATE equ 1h WM_COMMAND equ 111h WS_BORDER equ 800000h LB_ADDSTRING equ 180h CBS_DROPDOWN equ 2h CB_ADDSTRING equ 143h CB_SETCURSEL equ 14Eh CB_GETCURSEL equ 147h ;Structures  .data ClassName db "MainWinClass",0 Class_button db 'BUTTON',0 title_button db 'create fibonachi',0 class_list_box db 'LISTBOX',0 class_combo db 'combobox',0 AppName db "Лабораторна робота №4",0 fff db '%d',0 s dd 0 buff db 260 dup(0) .data? hwnd DWORD ? hbutton dd ? hlist dd ? hcombo dd ? WNDCLASSEX: cbSize DWORD ? cbSize DWORD ? style DWORD ? lpfnWndProc DWORD ? cbClsExtra DWORD ? cbWndExtra DWORD ? hInstance DWORD ? hIcon DWORD ? hCursor DWORD ? hbrBackground DWORD ? lpszMenuName DWORD ? lpszClassName DWORD ? hIconSm DWORD ? MSG: ms_hwnd DWORD ? ms_message DWORD ? ms_wParam DWORD ? ms_lParam DWORD ? ms_time DWORD ? ms_x DWORD ? ms_y DWORD ?   Код: (asm файл) .586 .model flat,STDCALL option casemap:none include l4.inc .code begin: ; визначаємо хендл модуля call GetModuleHandle, NULL mov hInstance,eax ; заповнюємо структуру WNDCLASSEX mov cbSize,12*4 mov style,CS_HREDRAW or CS_VREDRAW mov lpfnWndProc, OFFSET WndProc mov cbClsExtra,NULL mov cbWndExtra,NULL ; колір фону сірий call CreateSolidBrush,00ADF8E7h mov hbrBackground,eax mov lpszMenuName,NULL mov lpszClassName,OFFSET ClassName ; іконка програми IDI_APPLICATION call LoadIcon,NULL,IDI_APPLICATION mov hIcon,eax mov hIconSm,eax ;курсор стандартний call LoadCursor,NULL,IDC_ARROW mov hCursor,eax ;реєструемо новий клас call RegisterClassEx,offset WNDCLASSEX ;ств. батьківське вікно call CreateWindowEx,NULL,offset ClassName,offset AppName,\ WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\ CW_USEDEFAULT,500,\ 500,NULL,NULL,\ hInstance,NULL mov hwnd,eax ;ств. кнопку, на батьківському вікні (стиль WS_CHILD) call CreateWindowEx,0,offset Class_button,offset title_button,\ WS_CHILD + WS_VISIBLE,10,350,200,25,hwnd,0,hInstance,0 mov hbutton,eax ; ств. вікно список,на батьківському вікні (стиль WS_CHILD) call CreateWindowEx,0,offset class_list_box,0,WS_CHILD + WS_VISIBLE,\ 10,10,450,250,hwnd,0,hInstance,0 mov hlist,eax call CreateWindowEx,0,offset class_combo,0,CBS_DROPDOWN + WS_CHILD + WS_VISIBLE,\ 10,270,450,530,hwnd,0,hInstance,0 mov hcombo,eax xor ecx,ecx inc ecx @a1: push ecx mov s,esp call wsprintf,offset buff,offset fff,ecx mov esp,s call SendMessage,hcombo,CB_ADDSTRING,0,offset buff pop ecx inc ecx cmp ecx,16 jl @a1 call SendMessage,hcombo,CB_SETCURSEL,2,0 ; цикл прослуховування повідомлень loop: ;відловити тільки ті що відносятся до нашого вікна call GetMessage, OFFSET MSG,NULL,0,0 ;якщо 0 або -1, вікна не має test eax,eax jz @exit ; перетворюємо з віртуальних ключів у систему повідомлень call TranslateMessage, offset MSG ; відпра. на обробку у функ. WndProc call DispatchMessage, offset MSG jmp loop @exit: call ExitProcess,0 fibonachi proc x:DWORD ; функ. підрахунку фібоначі LOCAL a,b:DWORD mov word ptr buff,'1' mov a,1 mov b,1 call SendMessage,hlist,LB_RESETCONTENT,0,0 ;чистимо лыст бокс call SendMessage,hlist,LB_ADDSTRING,0,offset buff ; додаэмо 1 елемент "1"   @11: ; далі по формулі a[i]=a[i-1]+a[i-2] call wsprintf,offset buff,offset fff,a call SendMessage,hlist,LB_ADDSTRING,0,offset buff mov ecx,a mov eax,b add a,eax mov b,ecx dec x jnz @11 ret fibonachi endp ; функ. обробки повыдомлень вікна WndProc proc hWnd1:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD LOCAL p:DWORD ; якщо прийшло повідомлення про знищення вікна, перейти на мітку @DESTROY cmp uMsg,WM_DESTROY jz @DESTROY ; якщо прийшло повідомлення про створення вікна, перейти на мітку @CREATE cmp uMsg,WM_CREATE jz @CREATE ;якщо прийшло повідомлення про здійснення дії (наприклад натиснута кнопка), перейти на мітку @COMMAND cmp uMsg,WM_COMMAND jz @COMMAND ; виклік фун. дія по замовчуванню call DefWindowProc,hWnd1,uMsg,wParam,lParam ret @DESTROY: ; відправ. повід про закриття вікна call PostQuitMessage,NULL ret @CREATE: ret @COMMAND: mov eax,lParam ; якщо lParam = hbutton (хендлу кнопки) cmp eax,hbutton jnz @nobutton ;ні, перехід на @nobutton call SendMessage,hcombo,CB_GETCURSEL,0,0 call fibonachi,eax @nobutton: ret WndProc endp end begin   // Висновок: Виконавши лабораторну роботу я навчився працювати з вікнами, і написав свою першу програму.
Антиботан аватар за замовчуванням

09.04.2015 00:04-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!