Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра АСУ
Звіт до
лабораторної роботи №4
з курсу « Системного програмування»
на тему «Стандартні класи вікон та їх типи.»
Львів 2014
Мета роботи: зрозуміти поняття вікна в операційній системі Windows.
ТЕОРЕТИЧНІ ПОЛОЖЕННЯ
Все, що бачить користувач на екрані в системі WINDOWS є вікном. Вікно – це графічна оболонка, через яку програма може спілкуватися з користувачем. Якщо програмі не потрібно спілкуватись, то вона може і не створювати вікна. Вікно може володіти набором інших вікон, які називаються дочірніми (кнопки, рядки вводу, і т.д.).
Кожне вікно має власний набір властивостей який відрізнятися певною специфікою спілкування з користувачем. Такі специфічні особливості називаються класом вікна. Існують стандартні класи, наприклад, вікно–регулювач, вікно-кнопка, вікно для вводу тексту, вікно-підказка та інші. Кожний стандартний клас має унікальну назву, яка дійсна для всіх версій операційних систем WINDOWS. Нижче приведено перелік стандартних класів вікона:
BUTTON Стандартна прямокутня кнопка
COMBOBOX Комбінований список з полем редагування у верхній частині або випадний список вибору.
EDIT Прямокутний елемент редагування для введення тексту користувачем. Може містити одну або декілька рядків.
LISTBOX Елемент типу список. Елемент управління, що містить список рядків, які можуть бути вибрані.
MDICLIENT Клієнтське вікно багатодокументного інтерфейсу (MD1 — multiple-document
interface). Це вікно отримує повідомлення, які управляють дочірніми вікнами багатодокументного інтерфейсу в застосуванні. Для правильної роботи застосування багатодокументного інтерфейсу необхідно створити вікно MIDIСLIENT.
RICHEDlT Елемент управління Rich Edit версії 1.0. Елемент управління такого типу дозволяє редагувати текст з багатьма шрифтами і стилями. У Windows 2000 елемент управління цього типу емулює версію 1.0 на основі версії 3.0.
SCROLLBAR Елемент управління лінійкою прокрутки.
STATIC Елемент управління статичним текстом. Застосовується для розміщення у вікні тексту або рамок.
Для створення вікна використовується функція CreateWindowEx. Опис функції можна знайти у довіднику.
Це все добре, але як створити вікно з кнопками, рядками вводу і т.п., і заставити виконувати певну дію, наприклад, при натисненні кнопки або руханні мишки над вікном?
Розберемося як будувати складні вікна.
Першим кроком потрібно створити новий клас вікна, оскільки такого екземпляру у системі немає. Мається на увазі, є стандартні вікна, типу "кнопка", "рядок вводу", але немає стандартного вікна, який би містив в собі, наприклад, кнопку і рядок вводу. Для створення нового класу використовується процедура RegisterClassEx. Хоча документацію по функціям можна знайти у довіднику, для зрозумілості кожну функцію розглянемо детально.
Другим кроком, потрібно на основі нового класу створити так зване "батьківське" вікно, тобто, вікно на якому будуть розташовані "дочірні" об’єкти (вікна).
Дочірні - це вікна які розташовані на батьківському вікні та підпорядковані йому. Батьківське вікно обробляє всі повідомлення дочірнього вікна.
Як вище було згадано, для створення вікна використовується функція
Третім кроком, нам потрібно відфільтровувати повідомлення для нашої програми забирати з системи та відправляти їх на обробку у віконну процедуру. Цю дію виконує процедура GetMessage.
Четвертим кроком буде перетворення віртуально-ключових повідомлень у повідомлення символів. Це робиться за допомогою процедури TranslateMessage.
Останнім п’ятим кроком буде відправлення повідомлення у процедуру вікна за допомогою процедури DispatchMessage.
Кроки 3,4,5 потрібно виконувати в циклі до тип пір поки функція GetMessage не поверне значення "0" або "-1".
Тепер приступимо до найважливішої частини програми.
Наступним кроком є створення процедури обробки повідомлень. Назва функції може бути довільна, але ця назва має фігурувати у коді програми при реєстрації класу(поле структури WNDCLASSEX – lpfnWndProc). Найчастіше процедура має назву WNDProc.
Більш детальнішу інформацію можна знайти у довідці по WinApi функціях.
Хід роботи:
Створити 2 кнопки, рядок вводу, статичний текст. При натисненні кнопки №1 вивести діалог вибору файлів по фільтру "*.bmp". При виборі графічного файлу шлях до нього занести у рядок вводу. При натисненні кнопки №2, вивести зображення на вікно статичного тексту.
Записую код програми:
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
include comctl32.inc
includelib comctl32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
.data
ClassName db "Hata1",0
AppName db "Hrus4ovka",0
c_button db 'button',0
t_button db 'Tukalka',0
f db '%03d:%03d %s',0
c_skr db 'SCROLLBAR',0
c_anim db 'SysAnimate32',0
animahko dd 0
FILE1 db 'c:\PRG\ASM_\ASM\masm\Projects\Lab_4\1.avi',0
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hbutton dd ?
.586
.model flat,stdcall
option casemap:none
include laba4_11.inc
include RADbg.inc
.code
; ---------------------------------------------------------------------------
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke InitCommonControls
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_HAND
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW ,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
hInst,NULL
mov hwnd,eax
invoke CreateWindowEx,0,addr c_button,addr t_button,WS_BORDER+ WS_CHILD + WS_VISIBLE + BS_RIGHT,10,10,120,20,hwnd,0,hInstance,0
mov hbutton,eax
invoke CreateWindowEx,0,addr c_skr,0,WS_VSCROLL+ WS_CHILD + WS_VISIBLE,400,10,20,300,hwnd,0,hInstance,0
invoke CreateWindowEx,0,addr c_anim,0,WS_CHILD + WS_VISIBLE,100,100,300,300,hwnd,0,hInstance,0
mov animahko,eax
invoke ShowWindow, hwnd,SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.WHILE TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam
ret
WinMain endp
p1 proc hwin,lp:dword
invoke LoadCursor,NULL,IDC_HAND
invoke SetClassLong,hwin,GCL_HICON,eax
invoke SendMessage,hwin, WM_SETICON,ICON_BIG,eax
invoke SetWindowText,hwin,addr t_button
mov eax,1
ret
p1 endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL x,y:dword
LOCAL buf[50]:byte
LOCAL p:POINT
LOCAL buf2[200]:byte
.IF uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_CREATE
invoke SetTimer,hWnd,12,100,0
.elseif uMsg == WM_COMMAND
mov eax,lParam
.if eax == hbutton
invoke EnumWindows,addr p1,0
invoke SendMessage,animahko,ACM_OPEN,0,addr FILE1
invoke SendMessage,animahko, ACM_PLAY, -1, -0ffffh
.endif
.elseif uMsg == WM_TIMER
invoke GetCursorPos,addr p
invoke ScreenToClient,hWnd,addr p
invoke ChildWindowFromPoint,hWnd,p.x,p.y
mov ecx,eax
.if eax != hWnd
invoke GetWindowText,ecx,addr buf2,200
invoke wsprintf,addr buf,addr f,p.x,p.y,addr buf2
invoke SetWindowText,hWnd,addr buf
.endif
;
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
end start
Приклади виконання програми:
/
Висновок: на цій лабораторній роботі я навчився створювати вікна в операційній системі Windows. Створив 2 кнопки, рядок вводу, статичний текст. При натисненні кнопки №1 вивів діалог вибору файлів по фільтру "*.bmp". При виборі графічного файлу шлях до нього заніс у рядок вводу. При натисненні кнопки №2, вивів зображення на вікно статичного тексту.