69765

Графічний інтерфейс користувача

Лекция

Информатика, кибернетика и программирование

Спільним у них є набір основних елементів реалізації куди входять вікна з елементами керування кнопками смугами прокручування тощо меню і піктограми а також використання пристрою для переміщення курсору по екрану та вибору окремих елементів наприклад миші.

Украинкский

2014-10-09

61.5 KB

1 чел.

Тема 13. Графічний інтерфейс користувача

Засоби організації графічного інтерфейсу користувача неоднакові для різних ОС. Спільним у них є набір основних елементів реалізації, куди входять вікна з елементами керування (кнопками, смугами прокручування тощо), меню і піктограми, а також використання пристрою для переміщення курсору по екрану та вибору окремих елементів (наприклад, миші).

Розрізняють два основних підходи до реалізації графічного інтерфейсу користувача. Для першого характерна тісна інтеграція у систему засобів його підтримки (вони, наприклад, можуть бути реалізовані в режимі ядра). Другий реалізує підтримку такого інтерфейсу із використанням набору застосувань і бібліотек рівня користувача, який ґрунтується на засобах підсистеми введення-виведення. У цьому розділі як приклад інтегрованої підтримки графічного інтерфейсу користувача буде описано віконну і графічну підсистеми Windows XP, а як приклад реалізації його підтримки в режимі користувача — систему X Window.

13.1. Інтерфейс віконної та графічної підсистеми Windows XP

У розділі 2 було розглянуто архітектуру віконної та графічної підсистеми Windows XP. У цьому розділі зупинимося на базових принципах організації програмного коду для цієї підсистеми [44] і наведемо невеликий приклад застосування, яке використовує її можливості.

Базовим елементом Win32-застосування, яке використовує можливості віконної та графічної підсистеми, є вікно, де це застосування може відображати свою інформацію. Кожне вікно належить деякому класу вікна (window class), який реєструється у системі. Програма починає своє виконання із реєстрації класу вікна, після цього об'єкт вікна може бути розміщений у пам'яті та відображений.

Взаємодія із користувачем у застосуваннях, що використовують вікна, відрізняється від тієї, про яку йшлося під час розгляду консольних застосувань. Основним тут є те, що застосування має бути завжди готовим виконати код у відповідь на дії користувача. Наприклад, у будь-який момент може знадобитися перемалювання зображення внаслідок того, що користувач змінив розмір вікна або зробив його активним, вибравши відповідну піктограму мишею на лінійці задач.

Таку постійну готовність складно реалізувати із використанням послідовного виконання коду. У Win32 (і більшості систем, що реалізують графічний інтерфейс користувача) використовують інший підхід до організації програмного коду: в ній реалізовані застосування, керовані повідомленнями (message-driven applications). Усі дії користувача (введення із клавіатури, переміщення миші тощо) ОС перехоплює і перетворює у повідомлення (messages), які скеровує застосуванню, що володіє вікном, із яким працював користувач. Код застосування містить цикл обробки повідомлень, де відбуваються очікування повідомлень та їхні необхідні перетворення, а також оброблювач повідомлень, що його викликають у разі отримання кожного повідомлення. В оброблювачі реалізовано код, який визначає реакцію застосування на ту чи іншу дію користувача. Цикл обробки повідомлень триває доти, поки в нього не потрапить особливе повідомлення, що змушує завершити роботу застосування.

Найпростіший приклад реалізації \У"іп32-застосування із використанням графічного інтерфейсу користувача наведено нижче.

Розробка головної функції застосування

Win32-застосування із підтримкою вікон відрізняються від консольних застосувань, описаних дотепер. Насамперед головну функцію таких застосувань визначають інакше. її називають WinMain():

int WINAPI WinMain( HINSTANCE ih. HINSTANCE ip.

LPSTR cmdline, int cmd_show ) {

// код головної функції застосування

}

де: іh — дескриптор екземпляра застосування, який можна використати для ідентифікації виконуваної копії застосування;

cmdline — командний рядок, заданий під час запуску застосування; cmd_show — код, що визначає, як передбачено відображати головне вікно застосування (SW_MAXIMIZE, SW_MINIMIZE тощо).

У коді WinMain() насамперед потрібно зареєструвати клас головного вікна застосування. Клас вікна відображають структурою WNDCLASS, для якої потрібно задати ряд полів, зокрема:

  •  IpszClassName — ім'я класу, під яким він буде зареєстрований;
  •  lpfnWndProc — адресу процедури вікна, яку система викликатиме з появою повідомлень, адресованих цьому вікну;
  •  hIcon — дескриптор піктограми цього вікна (вона відображатиметься у його заголовку або на панелі задач; для отримання такого дескриптора використовують функцію LoadIcon());
  •  hCursor - дескриптор курсору, що відображатиметься над вікном; для його отримання використовують функцію LoadCursor());
  •  hbrBackground — дескриптор спеціального об'єкта (пензля, brash), що визначає фоновий колір цього вікна (стандартний колір фону може бути заданий додаванням одиниці до наперед визначеної константи COLORWINDOW). Ось приклад підготовки класу вікна:

WNDCLASS wc = { 0 };

wc.lpszClassName = "myclass":

wc.1pfnWndProc - wnd_proc; // визначення wnd_proc() див. нижче

// стандартна піктограма застосування

wc.hlcon - LoadI con (NULL. IDI_APPLICATION);

// стандартний курсор-стрілка

wc.hCursor - LoadCursoKNULL. IDC_ARR0W);

wc.hbrBackground = (HBRUSH)(C0L0R_WIND0W+1);

Після визначення цієї структури покажчик на неї передається у функцію RegisterClass():

RegisterClass(&wc)

Реєстрація класу вікна дає змогу розміщувати у пам'яті та відображати вікна такого класу. Для розміщення вікна у пам'яті використовують функцію Create-Window():

HWND CreateWindowCLPCTSTR classname. LPCTSTR title. DWORD style, int x. int y. int width, int height. HWND ph. HMENU mh.

HINSTANCE ih.  LPVOID param );

де: classname — ім'я, під яким був зареєстрований клас цього вікна;

title — текст, відображуваний у заголовку вікна;

style — стиль вікна, який визначає спосіб його відображення (WS_OVERLAPPED-WIND0W – стандартне вікно із заголовком і керуючим меню);

х і у – координати лівого верхнього кута вікна, width і height – його ширина і висота (ці величини задають у спеціальних віртуальних одиницях, які спрощують масштабування);

іh — дескриптор застосування, що створює вікно (як значення передають відповідний параметр WinMain()). Ця функція повертає дескриптор вікна (значення типу HWND), за допомогою якого можна дістати доступ до розміщеного у пам'яті об'єкта вікна, наприклад для його відображення.

HWND hwnd = CreateWindow("myclass",  "Приклад застосування". WS_OVERLAPPEDWINDOW.  0.  0.  300,  200.  NULL.  NULL,  hinst.  NULL );

Для відображення вікна використовують функцію ShowWindow(): ShowWindow(hwnd. cmd_show);

Після того як вікно було відображене, потрібно організувати цикл обробки повідомлень. У ньому необхідно отримати повідомлення за допомогою функції GetMessage(), перетворити його за допомогою функції TranslateMessage() і передати у функцію вікна для подальшої обробки викликом DispatchMessageO. Усі ці функції використовують структуру повідомлення, що належить до типу MSG.

Використання функції TranslateMessage() необхідне під час обробки повідомлень від клавіатури (натискання клавіш перетворюються у повідомлення, що містять введені символи).

Цикл завершується, коли в нього надходить повідомлення завершення (із кодом WM_QUIT), внаслідок чого GetMessage() поверне нуль.

MSG msg:

while( GetMessageC &msg, NULL. 0. 0 )) {

Trans!ateMessageC &msg );

DispatchMessageC &msg );

}

Значенням, яке поверне WinMain(), має бути значення поля wParam структури повідомлення:

return (int)msg.wParam;

Розробка функції вікна

Функція вікна визначається так:

long CALLBACK wnd_proc(HWND hwnd, UINT msgcode. WPARAM wp, LPARAM lp) {

// обробка повідомлень, адресованих вікну

}

де: hwnd — дескриптор відповідного вікна; msgcode — код повідомлення, що надійшло;

wp, lp — додаткові дані, які можуть супроводжувати повідомлення (відповідають полям wParam і ІРагат структури повідомлення). У коді цієї функції перевіряють код повідомлення і залежно від його значення виконують дії.

switch (msgcode) {

case код-повідомлення1:

II  дії з обробки повідомлення1

case код-повідомлення2:

II  дії з обробки повідомлення2 і т. д.

}

Є багато різних повідомлень, тут реалізуємо виконання дій у разі одержання двох із них:

WM_PAINT — надходить вікну щоразу, коли його вміст потрібно перемалювати (у разі відображення, активізації, переміщення тощо);

WM_CL0SE — надходить у разі закриття вікна користувачем.

Про обробку WM_PAINT ітиметься окремо, а поки що зупинимося на діях після отримання WM_CL0SE та обробці повідомлень за замовчуванням.

У разі отримання повідомлення WM_CL0SE необхідно припинити виконання застосування, для чого потрібно перервати цикл обробки повідомлень. Стандартний спосіб реалізувати таке переривання — скористатися функцією PostQuitMessage(), яка поміщає в цикл повідомлення із кодом WM_QUIT. Як параметр ця функція приймає значення, що стане кодом повернення застосування.

switch (msgcode) {

case WM_CLOSE:

PostQuitMessage(O);

return 0;

}

Коли у вікно надійшло повідомлення, яке функція вікна не може обробити, у ній потрібно забезпечити обробку такого повідомлення, передбачену ОС (обробку за замовчуванням). Для її реалізації необхідно викликати стандартну функцію вікна, тобто виконати функцію DefWindowProc(), куди передати ті самі параметри, що були отримані функцією вікна.

switch Cmsgcode) {

// обробка відомих повідомлень

}

// обробка всіх інших повідомлень

return DefWindowProc(hwnd. msgcode, wp, Ip);

Відображення графічної інформації та контекст пристрою

Залишилося розглянути особливості обробки повідомлення WM_PAINT. Під час цієї обробки потрібно відобразити у вікні певну графічну інформацію. Повідомлення WM_PAINT надходитиме у функцію вікна щоразу, коли таке відображення стане необхідним, наприклад, вікно повідомлення буде виведене поверх інших вікон. Розглянемо, як у Win32 АРІ реалізоване відображення графічної інформації.

Для цього використовують стандартні засоби графічного виведення, які забезпечує GDI. Основною їхньою особливістю є незалежність від пристрою: наприклад, один і той самий код можна використати для відображення інформації на екрані і принтері. Найважливішою концепцією відображення при цьому є контекст пристрою (device context).

Такий контекст є внутрішньою структурою даних, що описує поточні властивості пристрою відображення. Перед виконанням відображення застосування має отримати дескриптор контексту пристрою (об'єкт типу HDC) і передати його як один із параметрів у функцію відображення; після виконання цей контекст потрібно вивільнити, внаслідок чого у систему повернуться ресурси, які були потрібні для відображення.

Для отримання контексту пристрою найчастіше використовують дві функції: BeginPaintO викликають із коду оброблювача повідомлення WMPAINT, GetDCO -в усіх інших випадках. Першим параметром у BeginPaintO передають дескриптор вікна, другим - покажчик на структуру PAINTSTRUCT, яку заповнюють інформацією про ділянку відображення (наприклад, про її розміри). Для вивільнення контексту використовують відповідно функції EndPaintO і ReleaseDCO:

PAINTSTRUCT ps: HDC hdc:

switch (msgcode) {

case WM_PAINT:

hdcBeginPaint( hwnd. &ps );

// ... відображення графіки з використанням hdc

EndPaint( hwnd. &ps ):

return 0:

}

Після отримання дескриптора контексту пристрою його можна передавати у різні функції відображення графічної інформації (GDI-функції). їх дуже багато,

для прикладу опишемо використання найпростішої функції відображення тексту - TextOutO:

BOOL TextOut(HDC hdc. int x. int y. LPCTSTR str, int Ten);

де: hdc — дескриптор контексту пристрою;

x, у — координати точки, із якої почнеться виведення тексту; str — виведений рядок;

len — довжина рядка без завершального нуля. Виведення тексту у вікно застосування виглядатиме так:

TextOutthdc. 10, 10. "Hello. World!". 13):

Контрольні питання:

1. Інтерфейс віконної та графічної підсистеми Windows XP.

2. Розробка головної функції застосування.

3. Розробка функції вікна.

4. Відображення графічної інформації та контекст пристрою.


 

А также другие работы, которые могут Вас заинтересовать

23230. Поняття політичної системи та її структури 39 KB
  Поняття політичної системи та її структури Політична система це цілісна інтегрована сукупність політичних суб'єктів структур і відносин що відображає інтереси всіх політичних і соціальних сил. Ознаки політичної системи: 1. Структура політичної системи: 1. Політизовані або невласне політичні організаціїучасть у здійсненні політичної влади для яких є лише одним з аспектів їх функціонування.
23236. Традиції і новаторство в культурі 46.5 KB
  Спадкоємність культури це процес передачі культурноісторичного досвіду. Саме в спадкоємності як органічному поєднанні традиції і новаторства реалізується історичність культури її самозбереження й саморозвиток. Традиції існують у всіх формах духовної культури. Завдяки їм розвивається суспільство оскільки молоде покоління не винаходить заново велосипеди а засвоює досягнутий людський досвід культури.
23238. Аристотель, Стагірит 216 KB
  Зі сказаного очевидно що з того де йде мова про предмет необхідно говорити про предмет і ім'я й поняття; так наприклад людина говорить про предмет про окрему людину і про неї звичайно говорить ім'я [людини]: адже окремою людиною називають живу істоту й визначення людини буде визначати окрему людину адже окрема людина є й людина і жива істота. Так біле перебуваючи в тілі як у підметі говорить про предмет адже тіло називається білим але поняття білого ніколи не може означати тіло. Її предмет мислення як цілісне утворення...