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. Відображення графічної інформації та контекст пристрою.


 

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

53430. Математична подорож на Південний берег Криму 722 KB
  На тему: Математична подорож на Південний берег Криму. Математичнаподорож на Південний берег Криму. Ознайомити учнів з географічним положенням рослинним та тваринним світом Південного берега Криму розширювати та збагачувати знання дітей про природу виховувати любов до природи та бережливе ставлення до її багатств. Обладнання: фізична карта України гербарій рослин Південного берега Криму мультимедійні засоби навчання малюнки підручники: 1 Богданович М.
53431. Хімічна промисловість 91.5 KB
  Мета уроку: навчальна: Дати характеристику галузевої структури промисловості пояснити чинники розміщення різних типів підприємств визначити взаємозв’язки хімічної промисловості з іншими ознайомити учнів зі зразками полімерів продуктами хімічної промисловості пояснити хімічні процеси які відбуваються під час промислового синтезу речовин; розвивальна: розвивати пам’ять логічне мислення уміння нестандартного...
53432. Аналогії між літературними та математичними об’єктами 745 KB
  Вчитель математики: Іноді мені доводиться чути від учнів думку що не кожному з вас у подальшому житті знадобляться знання з математики. Перевірка домашнього завдання – 5 хвилин Вчитель літератури: Спочатку перевіримо домашнє завдання: вам потрібно було підібрати прислів’я в яких указувалося б на кількісні відношення. Команди по черзі називають прислів’я з числами; вчитель математики на дошці записує бали кожній команді.
53433. Правописание числительных – орфография на уроках математики 10.34 MB
  Сейчас вы уже знаете что имена числительные являются словесным выражением цифр и чисел. Теоретическая разминка по русскому языку Теоретическая разминка по математике Закончить предложение: Сумма двух отрицательных чисел Сумма двух противоположных чисел равняется Если произведение чисел – положительное число то множители имеют Если произведение чисел – отрицательное число то множители имеют Если произведение равно нулю то Любая теория важна для практики.
53434. Интеграция на уроках музыки 42.5 KB
  Интеграция уроков музыки и развития речи обеспечивает межпредметную связь и раскрывает взаимосвязь человека и искусства. Что же такое интеграция Вот как это понятие трактуется в логическом словаресправочнике Н. Кондакова: Интеграция это объединение в целом какихлибо частей элементов.
53435. Диффузия – основа жизни 38 KB
  Однако разрозненные знания не позволяют создать целостную картину мира поэтому основная задача нашего урока показать взаимосвязь казалось бы таких разных наук как физика и биология при изучении такого распространенного явления как диффузия. Дать определения понятиям осмос и диффузия. Какой процесс имел место а тургор б диффузия в осмос 6.
53436. Обучить формулам обращения в русском и английском языке 56 KB
  Традиции употребления обращений в русском и английском языке Цель: обучить формулам обращения в русском и английском языке; Задачи: Актуализировать знания учащихся по теме Формы обращения в русском и английском языке; Продолжить ознакомление учащихся с формулами обращения в русском и английском языке; Создать условия для активизации употребления формул речевого этикета в речи учащихся; Приобщать учащихся к культуре традициям и реалиям стран родного и иностранного языков в рамках конкретной ситуации общения отвечающей опыту...
53437. Звук «р», букви Р р. Письмо великої літери «Р». Парасолька Оле Лукойє 43 KB
  Парасолька Оле Лукойє. Тип уроку: комбінований Обладнання: парасолька ілюстрація Оле Лукойє розрізані букви складові таблиці по швидко читанню демонстраційна таблиця Р р ілюстрації квітів назви квітів розсипані слова фішки настроюфарби пензлик ескізи парасольки стрічки уваги мішечок. Діти як звуть цього дідуся Оле Лукойє Навіщо дідусю парасолька щоб творити дива Урок в нас діти незвичайний – Гостя радо зустрічаймо Казку слухати почнемо і дідусю доведемо Що настрій...
53438. Путешествие по карте Украины 57 KB
  Оборудование: компьютеры карта Украины фотографии с видами городов Украины. Каждый ученик при подготовке к уроку получил индивидуальное задание и задание для работы в группах проведя самостоятельную исследовательскую работу Работа по виртуальным картам Украины установленным на каждом мониторе компьютера. А знаете ли вы сколько в мире стран Около 200 Выберите правильный вариант названия страны изображённой на мониторе Италия Россия Франция Украина Польша Назовите и покажите на карте соседей Украины.