Створення графічного інтерфейсу користувача засобами Win32 API. Клас XmManager містить. вищої професійної освіти

Традиційний графічний підхід до інтерфейсу з користувачем пов'язаний з роботами Сазерленда, Ньюмена та ін, в якому взаємодія базується на використанні графічного дисплея з регенерацією та світлового пера. Подальший розвиток графічного діалогу пов'язаний із прогресом у галузі систем інтерактивної машинної графіки, що призвів до регламентації у вигляді міжнародних стандартів.
GKS – перший міжнародний графічний стандарт. У ньому вперше зафіксовано концепції "робочих станцій" та логічних пристроїввведення (клавіатура, вибір, локатор, валюатор, покажчик, введення послідовності координат). На жаль, задуманий під час переваги парадигми. векторного малювання. Звідси слабкість підтримки діалогу: відсутність можливості введення нових пристроїв або зміни зображення пристрою на екрані навіть з прикладної програми (користувача графічного пакету), що призводить до необхідності використання переважно символьного введення з організацією діалогу. Реалізація діалогу в GKS прерогатива прикладної програми, можливості роздільного проектування не передбачається.
Другий напрямок графіки - растрова графіка дуже вплинула на весь подальший розвиток інтерактивних систем. Всі основні риси інтерфейсу з користувачем на сучасних робочих станціях похідні від робіт Xerox PARC: управління вікнами

  • використання графічних символів("ікон") для представлення об'єктів
  • стиль взаємодії, званий безпосереднім маніпулюванням
  • популярність "миші" як пристрої позиціонування на екрані
  • об'єктно-орієнтований стиль програмування
З того часу система класифікації інструментарію для створення та управління інтерфейсом користувача розглядається на трьох рівнях:
  1. системи управління вікнами (WMS – Window Manager System);
  2. спеціалізований інструментарій;
    • звичайний (MacIntosh, SunView . . .)
    • об'єктно-орієнтований (Smalltalk-80, Andrew, InterView)
  3. системи управління інтерфейсом користувача.
У наступних розділах буде дано короткі характеристики, статус та функціональний опис кожного з цих рівнів.

Системи керування вікнами (WMS)

Багатовіконна технологія забезпечує користувача доступом до більшого обсягу інформації, ніж це можливо при роботі з одним екраном. Вікна дають доступ до багатьох джерел інформації. Користувач може поєднувати інформацію від кількох джерел, досліджувати інформацію на різних рівнях деталізації. У мультипрограмному режимі можна управляти кількома паралельними завданнями. Вхід та вихід кожного завдання відображається у різних вікнах, дозволяючи користувачеві зосередитись по необхідності на кожному завданні.
WMS, операційне середовище пов'язаних із вікнами ресурсів управління, здійснює підтримку:

  • вікон, що перекриваються (прямокутних областей екрану);
  • різних пристроїв введення (цифрових та аналогових);
  • курсорів;
  • шрифт.
Інтерфейс з боку оператора та прикладної програми містить команди закладу/знищення вікон, зміни їх розмірів та положення, підняття нагору, стискування вікна до піктограми та відновлення. Містить графічну бібліотеку виведення (тільки основні примітиви) та обробник подій. Тим самим є деякі механізми для реалізації інтерфейсу користувача.
Можливі реалізації WMS двох типів: базова система (Kernel System), що працює на одній машині, та мережна (Network oriented), що реалізується на основі моделі клієнт-сервер.

Інструментарій створення інтерфейсу користувача

Анотація: Вивчаються віджети – візуальні елементи, з яких складається графічний інтерфейс користувача, їх компонування, політика розмірів, сигнально-слотові з'єднання, елементи графічного інтерфейсу та їх використання.

13.1 Віджети (Widgets)

Віджети (Widgets) – це візуальні елементи, з яких складається графічний інтерфейс користувача.

Приклади віджетів:

  • Кнопка (клас QPushButton);
  • Мітка (клас QLabel);
  • Поле введення (клас QLineEdit);
  • Числове поле-лічильник (клас QSpinBox);
  • Рядок прокручування (клас QScrollBar).

У Qt є близько 50 готових класів графічних елементів доступних для використання. Батьківським класом для всіх віджетів є клас QWidget. Від нього успадковуються всі основні характеристики візуальних елементів, які ми ретельно розглянемо. Дослідження методів розробки програм з графічним інтерфейсом почнемо з прикладу.

Створимо порожній файлпроекту. Запустимо майстри проектів та виберемо в розділі Projects (Проекти) пункт Other Project (Інший проект). Далі виберемо тип проекту Empty Qt Project (Порожній проект Qt). До файлу проекту додамо вміст:

TEMPLATE = app #Модулі Qt, які ми будемо використовувати QT += widgets #Додаємо модуль widgets для роботи з віджетами (необхідно для Qt5). TARGET = widget#Назва виконуваного файлу SOURCES += \main.cpp

Тепер створимо просту програму з вікном, в якому ми виводитимемо напис. Встановимо розмір вікна та текст його заголовка, а також встановимо шрифт для напису. Для цього створимо файл main.cpp з таким змістом:

#include #include int main (int lArgc, char * lArgv ) ( // Створюємо об'єкт QApplication, який ініціалізує та налаштовує віконну програму, // керує її виконанням за допомогою циклу обробки подій QApplication lApplication (lArgc, lArgv); QLabel lLabel; // Створюємо віджет QLabel - мітка lLabel.setText ("I am widget!"); // Задаємо текст для мітки lLabel.setGeometry (200, 200, 300, 150); // Задаємо розміри - позицію (x, y) ширину і висоту. Задаємо вирівнювання тексту lLabel.setAlignment (Qt::AlignHCenter | Qt::AlignVCenter);//Клас QFont використовують для налаштування параметрів шрифту.//Вибираємо сімейство шрифтів Arial Black і розмір 12. QFont lBlackFont ("Arial Black", 12); setFont (lBlackFont);//Задаємо шрифт для мітки lLabel.show(); //Викликаємо метод show() для показу мітки на екрані return lApplication.exec(); Програма очікує дії користувача та виконує їх обробку.

Як бачимо, елементи, з яких складаються інтерфейси в Qt мають власні позицію і розмір - так звану "геометрію" - і, таким чином, займають відповідну прямокутну ділянку на екрані (див. рис. 13.1). Також кожен із елементів має налаштування, які визначають його поведінку та вигляд.


Мал. 13.1.

Для створення структури віджети організовують до ієрархії за принципом "частина - ціле". Кожен із віджетів може містити інші віджети. Такий візуальний елемент стає "батьком" (батьківським віджетом) для елементів, які він містить. Зазначимо, що такі відносини не слід плутати з успадкуванням у C++ - відносин між класами в програмі. Відносини між віджетами є відносинами між об'єктами. Такі відносини породжують кілька наслідків:

  • батьківський елемент відповідатиме за видалення дочірнього елемента: якщо батьківський віджет видалять - він автоматично видалить і всі дочірні елементи;
  • батьківський віджет розміщує дочірні віджети у собі, частини дочірніх віджетів, які за межі батька будуть невидимими;
  • частина стану батьківського віджету передається дочірнім - це стосується деяких властивостей (видимість, активність) та стилів, що накладаються на візуальний елемент.

Віджети, які не мають батька (віджети верхнього рівня), мають вигляд окремих вікон у програмі. Розглянемо приклад. Назвемо новий проект ParentExample. Файл проекту буде містити звичайні для GUI-проекту налаштування:

TEMPLATE = app TARGET = ParentExample QT + = widgets

Для віджету, який ми будемо використовувати як головне вікно, створимо новий клас. Для цього у категорії Files and Classes (Файли та класи)оберемо розділ З++ і оберемо З++ Class (див. рис. 13.2).

Наступним кроком буде створення кількох елементів у вікні. Для цього відкриємо файл parentwidget.cpp та змінимо код конструктора класу. Для відображення елементів достатньо створити їх у конструкторі класу та задати ParentWidget як батька для них. Код parentwidget.cpp виглядає так:

#include "parentwidget.h" #include #include #include ParentWidget::ParentWidget (QWidget * parent) : QWidget (parent) ( //Створюємо мітку, вказуючи батьківський віджет - this, тобто екземпляр класу ParentWidget. QLabel * lLabel=new QLabel (this); //Позиція щодо лівого верхнього кутабатьківського віджету. lLabel ->setGeometry (50, 0, 100, 30); lLabel -> setText ("TextLabel"); //Текст на мітці. //Створюємо кнопку, задаємо "батька", геометрію та текст QPushButton * lPushButton = new QPushButton (this); lPushButton->setGeometry (50, 50, 100, 30); lPushButton->setText ("PushButton"); //Створюємо поле введення, задаємо "батька", геометрію та текст QLineEdit * lLineEdit = new QLineEdit (this); lLineEdit ->setGeometry (50, 100, 100, 30); lLineEdit -> setText ("LineEdit"); lLineEdit ->selectAll(); //Виділяємо текст у полі введення (просто для прикладу) //Нарешті змінюємо розмір батьківського віджету setGeometry (x(), y(), 300, 150); //і задаємо текст заголовка вікна setWindowTitle ("parent widgetExample"); )

Оскільки батьківським елементом є ParentWidget, то мітка (QLabel), кнопка (QPushButton) і текстове поле (QLineEdit) знаходяться в його межах. Позицію дочірніх віджетів ставлять щодо лівого верхнього кута батька. У цьому легко переконатися, змінивши розміри та позицію вікна нашої програми. Зверніть увагу на те, як ми створювали елементи інтерфейсу користувача в динамічної пам'ятівикористовуючи оператор new. Це гарантує, що елементи не видаляються після завершення роботи конструктора ParentWidget .

Надано Салімом Гулом (Saleem Gul) та Томасом Павеком (Tomas Pavek)

У цьому навчальному курсі розглядається створення простого графічного інтерфейсу користувача та додавання до нього простої серверної функціональності. Зокрема, буде розглянуто код, що визначає поведінку кнопок та полів у формі Swing.

Ми розберемо компонування та структуру графічного інтерфейсу, після чого додамо кілька кнопок та текстових полів. Текстові поля призначені для отримання інформації, що вводиться користувачем, і виведення результату роботи програми. Кнопка ініціюватиме роботу функцій, вбудованих у клієнтську частину програми. Створюваний додаток є простим, але повнофункціональним калькулятором.

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

Передбачувана тривалість: 20 хвилин

Вправа 1: Створення проекту

Першим дією є створення проекту середовища IDE для програми, що розробляється. Дамо проекту ім'я NumberAddition .

  1. Виберіть "Файл" > "Створити проект". Також можна клацнути піктограму New Project на панелі інструментів середовища IDE.
  2. У розділі "Categories" виберіть вузол "Java". В області "Projects" виберіть "Java Application". Натисніть кнопку "Далі".
  3. Введіть NumberAddition у поле Project Name ("Ім'я проекту") і вкажіть шлях, наприклад, у вашому основному каталозі, як розташування проекту.
  4. Встановіть прапорець "Використовувати окрему папку для зберігання бібліотек" і вкажіть місце розташування папки бібліотек (необов'язково). Додаткову інформацію наведено у статті Надання доступу до бібліотеки іншим користувачам у документі Розробка програм за допомогою NetBeans IDE.
  5. Видаліть прапорець "Create Main Class", якщо його встановлено.
  6. Натисніть кнопку "Готово".

Вправа 2: Створення зовнішнього інтерфейсу

Для продовження процесу створення інтерфейсу необхідно створити контейнер Java, до якого будуть розміщені інші необхідні елементи графічного інтерфейсу. У цій дії контейнер буде створено за допомогою елемента JFrame. Контейнер буде поміщений у новий пакет, який відображатиметься у вузлі "Source Packages".

Створення контейнера JFrame

  1. У вікні "Проекти" клацніть правою кнопкою миші вузол NumberAddition та виберіть Створити > Інші.
  2. У діалоговому вікні створення файлу виберіть категорію Swing GUI Forms та тип файлу JFrame Form. Натисніть кнопку "Далі".
  3. Введіть NumberAdditionUI як ім'я класу.
  4. Виберіть пакет my.numberaddition.
  5. Натисніть кнопку "Готово".

Середовище IDE створює форму NumberAdditionUI та клас NumberAdditionUI у програмі NumberAddition і відкриває форму NumberAdditionUI у GUI Builder. Пакет my.NumberAddition замінює собою стандартний пакет.

Додавання елементів: створення зовнішнього інтерфейсу

Далі за допомогою вікна "Palette" зовнішній інтерфейсПрограми заповнюється панеллю JPanel. Після цього додаються три елементи JLabel (текстові підписи), три елементи JTextField (текстові поля) та три елементи JButton (кнопки). Якщо до цього робота з конструктором графічного інтерфейсу користувача не виконувалася відомості про розміщення компонентів див. розділ Розробка графічного інтерфейсу користувача Swing в IDE NetBeans.

Після перетягування та розміщення зазначених вище елементів елемент JFrame має виглядати так, як показано на малюнку нижче.

Якщо у правому верхньому куті середовища IDE немає вікна Palette ("Палітра"), виберіть Window ("Вікно") > Palette ("Палітра").

  1. Для початку виберіть панель із категорії Swing Containers ("Контейнери Swing") на панелі та перетягніть її на JFrame.
  2. Панель JPanel буде виділена. Перейдіть до вікна "Properties" і натисніть кнопку з трьома крапками (...) поряд з полем "Border" для вибору стилю кордону.
  3. У діалоговому вікні "Border" виберіть "TitledBorder" зі списку та введіть Number Addition у полі "Title". Щоб зберегти зміни та закрити діалогове вікно, натисніть кнопку "OK".
  4. Тепер на екрані має відображатися порожній елемент "JFrame" із заголовком "Number Addition", як показано на малюнку. Відповідно до малюнка додайте до нього три мітки JLabel, три текстові поля JTextField і три кнопки JButton.

Перейменування елементів

На цьому етапі буде виконано перейменування елементів, доданих до елемента JFrame.

  1. Двічі клацніть jLabel1 і змініть ntrcn (властивість "text") на First Number .
  2. Двічі клацніть jLabel2 і змініть текст на Second Number .
  3. Двічі клацніть jLabel3 і змініть текст на Result.
  4. Видаліть стандартний текст із jTextField1 . Текст можна перетворити на редагований. Для цього клацніть правою кнопкою миші текстове поле та виберіть "Редагувати текст" у спливаючому меню. При цьому може знадобитися відновити початковий розмір поля jTextField1 . Повторіть це для полів jTextField2 і jTextField3 .
  5. Змініть текст jButton1 на Clear . (Для зміни тексту кнопки клацніть правою кнопкою миші і виберіть "Edit Text". В якості альтернативи можна клацнути кнопку, витримати паузу і клацнути ще раз.)
  6. Змініть текст jButton2 на Add .
  7. Змініть текст jButton3 на Exit .

Тепер готовий графічний інтерфейс має виглядати так, як показано на малюнку нижче:

Вправа 3: Додавання функціональності

У цій вправі буде додано необхідну функціональність до кнопок "Add", "Clear" та "Exit". Поля jTextField1 та jTextField2 будуть використовуватися для введення значень користувачем, а jTextField3 – для виведення результату роботи програми. Створювана програма є найпростішим калькулятором. Отже, почнемо!

Додавання функціональності до кнопки "Exit"

Для того, щоб кнопки стали функціональними, кожній з них необхідно присвоїти обробник подій, який відповідатиме за реагування на події. У нашому випадку потрібно ідентифікувати подію натискання кнопки - клацання мишею або за допомогою клавіатури. Тому використовуватиметься інтерфейс "ActionListener", призначений для обробки подій "ActionEvent".

  1. Клацніть правою кнопкою миші кнопку "Exit". У спливаючому меню виберіть Events (Події) > Action (Дія) > actionPerformed. Врахуйте, що меню містить багато інших подій, на які може реагувати програма! При виборі події actionPerformed середовище IDE автоматично додасть прослуховувач ActionListener до кнопки Exit ("Вихід") та створить метод обробника для обробки методу прослуховувача actionPerformed.
  2. У середовищі IDE автоматично відкривається вікно "Source Code", де відображається місце вставки дії, яке має виконуватися кнопкою при натисканні (за допомогою миші або клавіатури). Вікно "Source Code" має містити наступні рядки: private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) ( //TODO add your handling code here: )
  3. Тепер додамо код дії, яку має виконувати кнопка "Exit". Замініть рядок TODO на System.exit(0); . Готовий код кнопки "Exit" має виглядати так: private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) ( System.exit(0); )

Додавання функціональності до кнопки "Clear"

  1. Клацніть правою кнопкою миші кнопку "Clear" (jButton1). У меню виберіть "Events > Action > actionPerformed".
  2. Натискання кнопки "Clear" повинно призводити до видалення всього тексту зі всіх текстових полів "jTextField". Для цього слід додати код, аналогічний наведеному вище. Готовий вихідний код має виглядати так: private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)( jTextField1.setText(""); jTextField2.setText(""); jTextField3.setText(""); )

Цей код видаляє текст із усіх трьох полів JTextField, залишаючи їх порожніми.

Додавання функціональності до кнопки "Add"

Кнопка "Add" має виконувати три дії.

  1. Спочатку вона приймає дані, введені користувачем у полях jTextField1 і jTextField2 і перетворює їх з типу "String" в тип "Float".
  2. Потім вона виконає додавання двох чисел.
  3. І, нарешті, вона перетворює суму на тип String і помістить її в jTextField3 .
Почнемо!
  1. Клацніть вкладку "Design" у верхній частині робочої області, щоб повернутися до екрана "Form Design".
  2. Клацніть правою кнопкою миші кнопку "Add" (jButton2). У спливаючому меню виберіть Events (Події) > Action (Дія) > actionPerformed.
  3. Додайте код дій, які має виконувати кнопка "Add". Готовий вихідний код повинен виглядати так: private void jButton2ActionPerformed(java.awt.event.ActionEvent evt)( // First we define float variables. float num1, num2, result; // We have to parse the text to a type float. num1 = Float.parseFloat(jTextField1.getText()); num2 = Float.parseFloat(jTextField2.getText()); result to jTextField3.// В той же час, ми витрачаємо // Зміна значення результату від float to a string.jTextField3.setText(String.valueOf(result));

Тепер програма повністю готова, і можна приступити до її збирання та виконання.

Вправа 4: Виконання програми

Для виконання програми у середовищі IDE виконайте наступні дії:

  1. Виберіть Run ("Запуск") > Run Main Project ("Запуск головного проекту") (як натисніть F6).

    Примітка.При відкритті вікна із зазначенням того, що для Project NumberAddition не заданий основний клас, слід вибрати my.NumberAddition.NumberAdditionUI як основний клас у тому ж вікні та натиснути кнопку ОК.

Щоб запустити програму поза IDE, виконайте такі дії:

За кілька секунд програма запуститься.

Примітка.Якщо під час подвійного натискання файлу JAR не запускається програма, див.

Можна також запустити програму з командного рядка.

Щоб запустити програму з командного рядка, виконайте такі дії:

  1. Викличте командний рядок або вікно терміналу.
  2. У командному рядку змініть поточний каталог на каталог NumberAddition/dist.
  3. У командному рядку введіть наступний оператор: java -jar NumberAddition.jar

    Примітка.Переконайтеся, що my.NumberAddition.NumberAdditionUI встановлено як основний клас до запуску програми. Для перевірки цього, клацніть правою кнопкою вузол миші вузол проекту NumberAddition на панелі "Проекти", виберіть "Властивості" у спливаючому меню та виберіть категорію "Виконати" у діалоговому вікні "Властивості проекту". У полі "Основний клас" має відображатись my.numberaddition.NumberAdditionUI .

Механізм обробки подій

У цьому посібнику було розглянуто реагування на просте подія натискання кнопки. Існує безліч подій, на які може реагувати програма. Переглянути список доступних подій, які можуть оброблятися елементами графічного інтерфейсу в середовищі IDE, можна так:

  1. Поверніться до файлу NumberAdditionUI.java у редакторі. Клацніть вкладку "Design", щоб переглянути структуру графічного інтерфейсу в GUI Builder.
  2. Клацніть правою кнопкою миші будь-який елемент графічного інтерфейсу і виберіть "Events" в меню. Тепер можна просто вивчити вміст меню, не вибираючи будь-яких пунктів.
  3. В якості альтернативи можна вибрати "Properties" у меню "Window". У вікні "Properties" клацніть вкладку "Events". Вкладка "Events" дозволяє переглянути та змінити обробники подій, пов'язані з поточним активним елементом графічного інтерфейсу.
  4. Додаток також може реагувати на натискання клавіш, одинарне, подвійне або потрійне клацання мишею, переміщення вказівника миші, зміна розміру вікна та переміщення фокусу введення. Меню "Events" дозволяє автоматично створити обробники подій для всіх цих подій. Найбільш поширеною з них є подія "Action". (Для отримання додаткових відомостейдив. практичні рекомендації щодо обробки подій у посібнику Sun Java Events Tutorial.)

Як здійснюється обробка подій? При виборі події з меню подій середовище IDE автоматично створює так званий прослуховувач подій і пов'язує його з компонентом розробника. Для більш детального ознайомлення з процесом обробки подій виконайте наведені нижче дії.

  1. Поверніться до файлу NumberAdditionUI.java у редакторі. Клацніть вкладку "Source", щоб переглянути вихідний код графічного інтерфейсу.
  2. Прокрутіть вниз і перегляньте реалізовані методи jButton1ActionPerformed() , jButton2ActionPerformed() та jButton3ActionPerformed() . Ці методи називаються обробниками подій.
  3. Тепер перейдіть до методу initComponents() . Якщо цей метод відсутній, знайдіть рядок Generated Code і клацніть знак + поруч із цим рядком для відображення прихованого методу initComponents() .
  4. Зверніть увагу на синій блок навколишнього методу initComponents() . Цей код був створений автоматично середовищем IDE і не може бути змінений користувачем.
  5. Тепер подивіться сам метод initComponents() . Крім іншого, він містить код, який ініціалізує елементи графічного інтерфейсу і поміщає їх у форму. Цей код створюється та оновлюється автоматично при розміщенні та зміні елементів у режимі проектування.
  6. У методі initComponents() знайдіть наступний фрагмент: jButton3.setText("Exit"); jButton3.addActionListener(new java.awt.event.ActionListener() ( public void actionPerformed(java.awt.event.ActionEvent evt) ( jButton3ActionPerformed(evt); ) )));

    У цьому місці до елемента графічного інтерфейсу, в даному випадку до jButton3, додається об'єкт прослуховування подій "ActionListener". Інтерфейс "ActionListener" має метод "actionPerformed" об'єкта "ActionEvent", який реалізується шляхом простого виклику обробника подій jButton3ActionPerformed. Тепер ця кнопка реагує на події. Щоразу при натисканні кнопки створюється подія "ActionEvent", яка передається в метод "actionPerformed" інтерфейсу прослуховування подій, що виконує код, передбачений розробником цієї події в обробнику подій.

  7. Навчальна карта за програмами з графічним інтерфейсом Java

Надіслати свою гарну роботу до бази знань просто. Використовуйте форму нижче

гарну роботуна сайт">

Студенти, аспіранти, молоді вчені, які використовують базу знань у своєму навчанні та роботі, будуть вам дуже вдячні.

Розміщено на http://www.allbest.ru/

Розміщено на http://www.allbest.ru/

ФЕДЕРАЛЬНА АГЕНЦІЯ З ОСВІТИ РФ

Державний освітній заклад

вищої професійної освіти

Російський державний гуманітарнийуніверситет

Інститут інформаційних наук та технологій безпеки

Кафедра загальної інформатики

КОНТРОЛЬНА РОБОТА

ЗА ІНФОРМАЦІЙНИМИ ТЕХНОЛОГІЯМИ

ГРАФІЧНІ ІНТЕРФЕЙСИ І ЗАСОБИ ЇХ РОЗРОБКИ

Лисиченок Костянтин Вікторович

Екстернату 3 роки навчання

(4-річний термін навчання)

Група б (інформаційна сфера)

Науковий керівник,

к.т.н., викладач: Машинцов О.О.

Москва 2005

План

Вступ

Система X Window

Загальний пристрій системи X Window

Програмування за допомогою бібліотеки X Toolkit Intrinsic (Xt)

Об'єкти Xt, їхня класифікація

Джерела інформації

Вступ

Коли вперше у 1959 р. на конференції UNESCO з обробки інформації м. Стречі запропонував режим поділу часу під час вирішення завдань на комп'ютерах - з цього моменту прийнято відраховувати початок інтерактивних обчислень і, отже, дослідження людино- машинного інтерфейсу. У міру зростання потужності комп'ютерів зростали витрати на діалогову компоненту програмного забезпечення. Питання ефективності використання машин загострилося під час стрімкого виходу ринку робочих станцій, які об'єднали інтерактивність з графікою. Термін ефективність з того часу змінив своє значення - якщо раніше він відображав такі характеристики як процесорний час та обсяг займаної пам'яті, то тепер під ним розуміють простоту розробки, легкість супроводу та зручність роботи з програмою. Тому витрати на дослідження і розробку інтерфейсу користувача є виправданими.

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

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

Можна прокласифікувати такі інструментарії (User Interface tools) згідно зі схемою:

* Текстові екранні системи (curse, ncurse, etc).

* Графічні екранні системи.

* Багатовіконні системи (WMS):

* символьно-орієнтовані (текстові);

* графічні;

* UI toolkits

* традиційні;

* Об'єктно-орієнтовані;

* UIDS - User Interface Development System - система розробки інтерфейсу користувача (інструментарій);

* UIMS - User Interface Management System - система (управління) інтерфейсу користувача (програмний модуль - складова частина кінцевого продукту в сукупності з відповідною UIDS);

* UIDE - User Interface Development Environment - середовище розробки інтерфейсу користувача.

Ця схема не претендує на систематичну класифікацію, скоріше - це просто перерахування.

В даний час великі зусилля прикладаються до розробки методів та створення інструментальних засобів у рамках систем, що отримали назву UIMS – User Interface Management System.

СистемаX Window

X Windowабо просто X- це система для створення графічного інтерфейсу користувача, спочатку - на комп'ютерах, що працюють під управлінням ОС UNIX. X була створена в MIT (Масачусетський технологічний інститут). В даний час вже випущено версію 11.6 (X11R6) і активно йде підготовка до випуску версії 7.

Особливістю X Window є її архітектура - вона побудована за схемою клієнт-сервер. Взаємодія X-клієнта та X-сервера відбувається в рамках відповідного протоколу прикладного рівня- X-протоколу. X Window байдужий використовуваний транспорт, яким може бути як локальний UNIX -socket, і будь-який мережевий, наприклад, TCP. Це означає, що X-клиент і X-сервер можуть " проживати " і різних комп'ютерах, тобто. програма може здійснювати введення-виведення графічної інформації на екрані іншого комп'ютера, причому, відмінності в архітектурі X-клієнта і X-сервера не відіграють жодної ролі - це забезпечується стандартом X-протоколу. Система забезпечує графічний висновокна екран машини, сприймає сигнали від пристроїв введення, таких як клавіатура і миша, і передає їх програмам. Слід зазначити, що пристрій виводу може мати більше екрана. X забезпечує висновок будь-якої з них. Все це: екран (екрани), пристрої введення (клавіатура, миша) називається термінами X Window - дисплей.

Завдяки своїй архітектурі X Window вільно використовується у розподілених обчислювальних системах, наприклад, у мережах TCP/IP (Internet).

X дозволяє користувачеві (за дисплеєм) спілкуватися з багатьма програмами одночасно. Щоб виведення з них не змішувалося, система створює на екрані дисплея "віртуальні підекрани" - вікна. Кожна програма (як правило) малює тільки у своєму вікні (або своїх вікнах). X надає набір засобів для створення вікон, їх переміщення екраном, зміни їх розмірів, виведення в них і т.п.

Як правило, програми мають набір конфігураційних параметрів- Ресурсів. Це може бути колір вікна, різні параметри текстового шрифту (лігатура, кегль, тощо) та багато іншого. Система стандартизує спосіб завдання ресурсів додатків, управління ними і містить ряд процедур для роботи з ними. Ця сукупність функцій називається " менеджер ресурсів " (Xrm - X resource manager). "Сховище" параметрів програми називається базою даних ресурсів.

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

Загальний пристрій X Window

Система X Windowявляє собою сукупність програм та бібліотек. "Серцем" її є спеціальна програма – X-сервер. Це окремий UNIX-процес, що має місце бути на комп'ютері, до якого приєднано екран. Саме сервер знає особливості конкретної апаратури, знає, що треба зробити, щоб вивести будь-який графічний об'єкт, наприклад, примітив, на екран. Він же вміє сприймати та обробляти сигнали, що надходять від клавіатури та миші.

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

Однак, щоб програмувати для X, зовсім необов'язково знати деталі реалізації сервера та X-протоколу. Система надає стандартну бібліотеку процедур, за допомогою яких програми здійснюють доступ до послуг X на високому рівні. Так, для того щоб вивести на екран точку, достатньо викликати відповідну стандартну процедуру, передавши їй необхідні параметри. Ця процедура виконає всю роботу з формування пакетів даних та передачі серверу.

X вікно

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

Вікно має начинку і край. Основними атрибутами вікна є ширина і висота начинки, а також ширина (товщина) краю. Ці параметри називаються геометрією вікна.

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

X Window дозволяє програмі створювати кілька вікон одночасно. Вони у ієрархію, у якій одні є " батьками " , інші - " нащадками " . Сам сервер на кожному екрані створює одне основне вікно, що є найвищим "батьком" всіх інших вікон. Це вікно називається "кореневим" (root).

Управління вікнами

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

Проте менеджер не може коректно керувати вікнами, нічого про них не знаючи. Вікна можуть мати різні властивості, які повинен забезпечувати саме менеджер вікон: наприклад, у багатьох випадках зручно мати заголовки вікон, в інших - бажано, щоб вікно не можна було зробити менше, або навпаки - більше, певного розміру. Вікно може бути "схлопнуто" в піктограму ("іконку") - у цьому випадку менеджер повинен знати, яку піктограму використовувати і як її назвати. Клієнти можуть повідомляти менеджеру свої побажання щодо вікон двома способами:

* при створенні вікна X можуть бути передані "рекомендації" (hints) про початкове становище вікна, його геометрію, мінімальні та максимальні розміри і т.д.;

* можна використовувати вбудований X спосіб спілкування між програмами - механізм "властивостей".

Графічні можливості X Window

Система X Window призначена для роботи на растрових дисплеях. Число біт на піксель називають глибиною або товщиною дисплея. Біти з однаковими номерами (однакові двійкові розряди) у всіх пікселях утворюють площину, ніби паралельну екрану. Її називають кольоровою площиною. X дозволяє малювати в будь-якій колірній площині (-ях), не торкаючись інших.

Значення пікселя не задає колір точки на екрані безпосередньо, але задає номер комірки у спеціальному масиві, у якій зберігається значення кольору, тобто. Значення пікселя задає номер кольору на поточній панелі.

X має великий набір процедур, що дозволяють малювати графічні примітиви: крапки, лінії, дуги, текст; працювати з областями довільної форми.

"Властивості" та атоми

У X Window вбудовані кошти на забезпечення інформацією між програмами- клієнтами. І тому використовується механізм " властивостей " (properties). "Властивість" - це інформаційна структура, пов'язана з деяким об'єктом, наприклад, вікном, доступна всім клієнтам X. Кожна властивість має ім'я та унікальний ідентифікатор - атом. Як правило, імена властивостей записуються великими літерами. Атоми використовуються для доступу до вмісту властивостей для того, щоб зменшити обсяг інформації, що пересилається між клієнтами та X сервером.

У X передбачено низку процедур, що дозволяють перевести ім'я властивості в унікальний атом і, навпаки, по атому отримати необхідні дані.

Деякі властивості та відповідні їм атоми є зумовленими і створюються на момент ініціалізації сервера.

Програмування з використанням бібліотекиX Toolkit Intrinsic (Xt)

Для полегшення програмування в системі X window було створено кілька пакетів. Стандартом де-факто в даний час є бібліотека X Toolkit Intrinsics (Xt), яка входить до комплекту стандартного постачання системи. Xt спрощує ініціалізацію програм та створення вікон. Крім того, бібліотека містить засоби для створення об'єктів (керуючих елементів), які використовуються програмами спілкування з користувачами. У термінах Xt керуючий елемент називається widget.

У теперішній моментна основі пакета реалізовані різні набори (множини) елементів, що управляють (об'єктів), наприклад, Athena, OSF/Motif, Open Look. Ці набори в сукупності з Xt застосовуються як зручний інструмент для створення інтерфейсів. Вони беруть на себе рутинну роботу, яку при написанні власної програми з використанням лише процедур базової бібліотеки X Window програмісту довелося б виконати вручну.

Основи Xt

програмування графічний інтерфейс користувача

Об'єкти Xt

Пакет Xt є основою створення керуючих елементів - widget-ов (заготовок). У сенсі Xt widget - це структура даних, поля якої включають ідентифікатор самого елемента, ідентифікатор його вікна, якщо є, і багато іншого. Атрибути такого об'єкта називають ресурсами. Ресурсами widget можуть бути, наприклад, колір вікна, колір межі вікна, шрифт тексту, що виводиться і т.д.

Кожен об'єкт належить до одного з визначених класів (widget class). Клас розуміється у звичному для объектно-ориентированного програмування сенсі, тобто: клас можна як безліч екземплярів (об'єктів), мають однакові характеристики. Класи Xt утворюють ієрархію.

Під час роботи програма створює самі об'єкти (примірники класів - widget). Вони утворюють сукупності, кожна з яких також є деякою ієрархією. Кожна така ієрархія називається деревом об'єктів (widget tree). Коренем дерева обов'язково є widget, що належить до одного з підкласів спеціального класу – Shell. Якщо серед двох widget A і B дерева об'єктів перший ближче до кореня, ніж другий, A є батьківським об'єктом ("батьком") для B, а B - подобъектом (або "дочірнім" об'єктом (нащадком)) для A. Таким чином, shell -об'єкт є батьківським widget для решти всіх widget даного дерева об'єктів. Саме він здійснює взаємодію програми та менеджера вікон.

Описана ієрархія widget відповідає взаємозв'язку вікон, що є властивістю X Window. Крім того, на об'єкти накладається й інша ієрархія. Справа в тому, що під час роботи одні об'єкти можуть керувати іншими. Наприклад, якщо об'єкт має подобъекты, то за зміні геометрії може автоматично перебудувати геометрії своїх нащадків. Щоб це могло здійснитися, між widget встановлюється зв'язок - зв'язок "управління". Кожен об'єкт може мати один або кілька "керованих" ним об'єктів.

Для взаємодії програми, що використовує Xt, з widget та X Window передбачено три механізми.

* Callback

Процедури (процедури зворотного виклику). Для будь-якого класу визначено сукупність дій, куди мають реагувати належні йому об'єкти. Наприклад, для будь-якого класу передбачена реакція на знищення widget. Коли дія здійснюється, відбувається виклик або стандартної функції Xt, або однієї або кількох процедур, що надаються програмою. Такі функції і називаються сallback-процедурами або просто callback.

* Action

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

* Event handlers

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

Загальна схема програмування

Програми, що працюють у X, повинні виконати ряд стандартних дій, як-то: встановити зв'язок із сервером, задати необхідні властивості для менеджера вікон, і ще багато інших кроків. Якщо використовується Xt, то це робиться однією процедурою - XtInitialize(). Вона ініціалізує сам пакет, менеджер ресурсів ((\term resource manager) X Window, та виконує інші необхідні операції. Звернення до XtInitialize() (або XtAppInitialize()) має передувати всім іншим викликам процедур Xt. XtInitialize() повертає ідентифікатор shell-widget , який може використовуватися як корінь дерева об'єктів програми Як правило, ім'я класу програми збігається з ім'ям самої програми, тільки починається з великої літери.Менеджер ресурсів використовує ім'я та клас програми для пошуку її параметрів у базі даних ресурсів.

Кожна програма може вказати деякі параметри в командному рядку. У Xt визначено "стандартні" параметри, які можуть бути передані під час запуску програми. Крім цього, у командному рядку можуть бути присутніми і не стандартні параметри, властиві лише цьому додатку. XtInitialize() сканує командний рядок та розміщує відповідні значення даних у базі даних.

При ініціалізації створюється також контекст програми - структура, яка зберігає всю інформацію про додатку. Контекст призначений захистити програму впливу різних модифікацій в операційній системі. XtInitialize() створює певний стандартний контекст (default context), але починаючи з четвертої версії X, рекомендується створювати для кожного окремого екземпляра програми окремий "особистий" контекст, для чого в термінах Xt слід використовувати виклик процедури XtAppInitialize() ( замість XtInitialize()). Зауважимо тут, що додаток у Xt може мати не один, як завжди, а кілька об'єктів "верхнього рівня".

Наступним після ініціалізації є етап створення керуючих елементів програми, опис взаємовідносин між ними, завдання реакцій на різні події (реєстрація обробників подій та інших подібних об'єктів). Це може робитися різними способами, традиційним є використання, наприклад, для створення об'єкта процедури XtCreateWidget(), для передачі управління об'єктом його батькові - процедури XtManageChild(), для реєстрації обробників подій для widget - процедури XtAddEventHandler(), і т.д. і т.п.

Після того, як всі об'єкти програми підготовлені до роботи, їх графічні уявлення (наприклад, відповідні цим widget вікна) з'являються на екрані процедурою XtRealizeWidget().

Наступний етап - основний цикл - цикл отримання та відправлення подій. Він реалізується викликом процедури XtMainLoop() (XtAppMainLoop()).

Програма, яка використовує лише процедури основної X бібліотеки (Xlib), повинна сама розглядати кожну подію (отримуючи її з черги подій явним викликом, наприклад, XNextEvent() або XPeekEvent()) і відповідним чином реагувати на неї. Якщо вікон у завдання кілька, то, перш ніж робити якісь дії, необхідно визначити, в якому з вікон відбулася подія, і на якому рівні ієрархії відбуватиметься обробка цієї події (чи оброблятиме ця подія даний об'єкт чи його батько?). Все це досить стомлююче.

Xt бере всю рутинну роботу він. XtMainLoop() отримує чергову подію та визначає вікно, якому воно призначене. У вікні знаходиться відповідний widget. Для останнього визначаються event handler, action -процедура або callback, зареєстровані для реакцію подію. Якщо така мережа, вони викликаються. Описаний вище механізм називається розсилкою подій.

XtMainLoop() (XtAppMainLoop()) автоматично завершує програму на вимогу менеджера вікон.

Об'єкти Xt, їхня класифікація

Xt надає набір засобів для створення об'єктів, які використовуються програмами для спілкування з користувачем, а в загальному випадку з іншим зовнішнім світом.

Кожен створюваний програмою widget є представником того чи іншого класу. Xt і пакети, що на ньому ґрунтуються, такі як OSF/Motif, Athena, Tk/tcl, Open Look, etc., мають велику кількість таких класів. Створення нових widget, не передбачених у стандартних бібліотеках, вимагає створення (визначення) відповідного класу, що, зазвичай, є трудомістким завданням.

Кожен клас має низку фіксованих характеристик, що є загальними всім його примірників (наприклад, список сallback -процедур). Значення цих показників у самих об'єктів можуть відрізнятися.

Усі класи Xt утворюють ієрархію. Якщо клас B ближче до вершини ієрархії, ніж клас D, B називається базовим для D, а D називається похідним класом (або підкласом) для B.

Підкласи успадковують характеристики всіх базових класів. Це означає, що екземпляр класу має характеристики не лише свого класу, а й атрибути всіх базових класів.

У програмах кожен клас ідентифікується змінною, яка вказує на відповідну структуру даних. Цю змінну називають покажчиком клас. Дані цієї структури заповнюються за ініціалізації Xt.

Основні класи widget:

Object. Абстрактний клас (клас, що не породжує власного об'єкта), який використовується як коріння дерева всіх об'єктів. Він містить єдиний підклас:

RectObj. Абстрактний клас, який використовується для визначення деяких загальних характеристик, необхідних для функціонування різних типів об'єктів (наприклад, об'єктів, що не мають вікна). Він містить підклас:

Core. Корінь дерева класи widget мають вікна. Цей клас визначає характеристики, загальні всім об'єктів, наприклад такі, як розмір вікна widget і його становище на екрані. Містить підклас:

Composite. Widget, що належать до даного класу, можуть бути батьківськими по відношенню до інших об'єктів. Примірники класу Composite визначають такі особливості поведінки своїх підходів:

* задає місце розташування "дочірніх" widget відповідно до тих чи інших обмежень;

* при знищенні звільняє пам'ять, використовувану подоб'єктами (при знищенні widget класу Composite спочатку будуть знищені всі його "нащадки");

* керує появою на екрані вікон своїх дочірніх widget;

* керує передачею фокусу введення між об'єктами.

Клас Composite містить підкласи:

Constraint. Цей клас є подальше розширення базового класу. Його екземпляри мають додаткові можливості для управління розміром та місцезнаходженням своїх нащадків. Наприклад, подобъекты можуть розміщуватися у спеціальному порядку: до ряду, до стовпця тощо.

Shell. Це особливий клас, призначений для взаємодії з менеджером вікон. widget з цього класу може мати лише одного нащадка. Клас Shell містить підкласи:

OverrideShell. Це важливий підклас класу Shell. Для вікна widget даного класуатрибут override_redirect встановлюється в значення True, тобто. менеджер вікон його контролює. Як правило, вікна об'єктів цього класу не мають аксесуарів, що додаються менеджером вікон (заголовок, рамка, стандартні кнопочки) і використовуються в основному для створення меню різного типу.

WMShell. Це спеціальний підклас класу Shell, що містить додаткові поля, необхідні взаємодії з менеджером вікон. Містить:

VendorShell. Цей клас призначений для того, щоб надати можливість взаємодії зі спеціальними менеджерами вікон. Цей клас містить підкласи:

TopLevelShell. Widget даного класу, як правило, використовуються як shell-об'єкти дерева об'єктів програми. Він містить:

ApplicationShell. Програма може мати, як правило, лише один екземпляр, що належить класу ApplicationShell.

TransientShell. Цей клас відрізняється від попереднього лише особливостями взаємодії з менеджером вікон. Вікна widget цього класу не можуть бути мінімізовані (перетворені на піктограму). Але якщо на піктограму перетворюється батько об'єкта класу TransientShell, то вікно widgetзабирається з екрана. Клас TransientShell використовується для створення діалогів.

Кожен із класів widget, а отже, і створювані на його основі об'єкти, мають досить велику кількість параметрів. У термінах Xt вони називаються "ресурси". Xt пропонує широкий вибір засобів для роботи з ними.

Додаткові можливості Xt

У Xt передбачено механізм для роботи з файлами (і взагалі із зовнішніми пристроями) в асинхронному режимі. Програма може зареєструвати процедуру, яка буде викликатись у міру готовності даних або при виникненні помилок читання/запису.

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

Xt надає можливість виконувати будь-які дії, коли черга подій порожня. Це реалізується через реєстрацію спеціальної "робочої" (work) процедури, яку Xt викличе, якщо черга подій спорожніє. Такі функції зазвичай використовуються для виконання різних дій та обчислень протягом дуже короткого часу.

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

Xt має механізм так званих акселераторів (accelerator), який дозволяє вводити залежності подій і дій. Акселератори схожі на action - процедури з тією різницею, що подія (або група подій), що відбувається в одному widget, ініціює виклик відповідної action-процедури іншого об'єкта.

Xt підтримує кілька способів роботи з вікнами widget. Так, програма, використовуючи процедури, що надаються Xt, може показати віконце, встановити для нього той чи інший режим роботи, і закрити віконце, коли воно стає непотрібним. В основному ці процедури використовуються для створення pop-up меню та діалогів. Як правило, всі множини widget (наприклад, OSF/Motif) мають свої набагато зручніші процедури для створення меню та діалогів.

Надбудови над Xt В даний час Xt строго стандартизований X консорціумом, але стандартів вищого рівня не існує. Популярністю користуються:

* OSF/Motif Toolkit;

* Athena Widget Set;

* OPEN LOOK Intrinsic Toolkit;

* InterViews;

* Tk/tcl.

Найбільш поширеним та майже стандартом де-факто, ймовірно, слід вважати OSF/Motif.

Athena

Athena Widget Set ("безліч widget") надається X консорціумом у комплекті стандартної поставки X. Athena була створена в ході роботи над базовими додатками та утилітами в ході реалізації проекту "Афіна" в MIT, результатом якого і є система X Window.

Athena спочатку мала " плоску " графіку - всі кнопки, меню та інші елементи інтерфейсу мали тіней, тобто. були пласкими. Близько року тому вийшла AW3d - варіант Athena Widgets, у якому цей недолік усунено.

Motif

Open Software Foundation Motif (OSF/Motif) є пакетом, що включає менеджер вікон, набір утиліт для виконання різних допоміжних операцій, а також бібліотеку об'єктів, побудованих на основі Toolkit Intrinsics.

Motif підтримує всі класи Xt і, отже, ресурси цих класів, але для запису імені та класу ресурсу об'єкта використовуються константи, що починаються відповідно до префіксу XmN та XmC. Для запису типу ресурсу використовуються константи з префіксом XmR (замість XtR, прийнятого Xt).

Motif розширює безліч класів об'єктів, що надається Xt. Зокрема, Motif підтримує досить великий набір класів, що дозволяють створювати меню, смуги прокручування scrollbar), кнопки, що редагують елементи і т.д.

Крім цього, Motif надає спеціальний клас об'єктів, які називаються gadget – вони утворюють у Motif окремий клас XmGadget, який є підкласом класу RectObj. Вони також можуть використовуватися для створення інтерфейсних елементів, але мають особливість - вони не мають власних вікон. Для малювання gadget користуються вікном свого батька.

Кожен клас widget має досить широкий вибір як успадкованих, і додаткових, специфічних йому ресурсів. Вони дозволяють керувати такими важливими характеристиками об'єктів, як колір фону, розташування на екрані, шрифт тексту, що виводиться і т.д.

Деякі класи Motif не використовуються для створення екземплярів widget (такі класи в термінології об'єктно-орієнтованого програмування називаються абстрактними). Вони містять найзагальніші атрибути та методи, необхідні для функціонування різних типів widget.

Motif має два основні підкласи об'єктів: XmPrimitive та XmManager (клас XmGadget згадувався раніше). Обидва ці класи є абстрактними. Перший з них успадковується від класу Core і використовується як базовий для класів об'єктів, які не мають інших об'єктів. Прикладами є кнопки, списки і т.д. Клас XmManager успадковується від класу Constraint і застосовується для створення об'єктів, які можуть мати та керувати дочірніми об'єктами.

Класифікація об'єктів

Клас XmGadget. Під час створення екземплярів звичайних класів об'єктів Motif (widget) породжується відповідне вікно. Якщо програма використовує багато widget, це призводить до значного уповільнення роботи програми. Час витрачається і створення вікон, і на подальшу роботуз ними. Але легко бачити, що наявність кожного об'єкта окремого вікна зовсім необов'язково. Мітки label, кнопки, та й багато інших widget з успіхом могли б використовувати для малювання вікна своїх батьківських об'єктів. Нема вікна - не треба звертатися зайвий раз до сервера, зростає продуктивність і не витрачається додаткова пам'ять.

Проводячи саме цю ідею в життя, розробники Motif продублювали деякі класи об'єктів, створивши дві версії – з вікном та без вікна. Версії об'єктів, що не мають вікон, ведуть свою ієрархію від абстрактного класу - XmGadget, і узагальнюючу назву у них така сама. Цей спеціальний клас об'єктів успадковує свої характеристики від класу RectObj, який, своєю чергою, є абстрактним класом, що містить у собі базові механізмиуправління геометрією об'єктів.

Крім того, що gadgets не мають власних вікон, на них накладаються інші обмеження. Так, їм не можна визначити обробники подій (event handler), таблиці трансляції. Крім того, gadget не можуть мати об'єктів-нащадків. В іншому функціональність gadget і відповідних widget однакова, тому описувати їх окремо ми не будемо, лише перерахуємо.

Клас XmGadget містить підкласи:

* XmArrowButtonGadget.

* XmLabelGadget.\hfil

* XmPushButtonGadget.

* XmToggleButtonGadget.

* XmCascadeButtonGadget.

* XmSeparatorGadget.

Клас XmPrimitive. Цей абстрактний клас містить:

XmArrowButton. Примірник класу є кнопкою, на якій намальована спрямована стрілка. Натисніть кнопку за допомогою миші або клавіатури. Кордон керуючого елемента може мати тінь, вона використовується для відображення різних станів, в яких може бути об'єкт: вільний ("віджатий") і натиснутий.

XmLabel. Представники цього класу (мітки) – одні з найпростіших об'єктів Motif. Мітки призначені для відображення інформації: тексту або малюнків (бітових (піксельних) карт).

XmPushButton. Представники цього класу суть прямокутні кнопки, в яких може бути намальований рядок тексту.

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

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

XmToggleButton. Об'єкти даного класу є маленькою кнопкою, поряд з якою, як правило, розташовується пояснювальний текст. Кнопка може перебувати у двох станах: увімкнено та вимкнено (тобто це перемикач). Вони відзначаються зміною зовнішнього вигляду елемента, що управляє.

Представник даного класу служить для створення так званих "кнопок, що відзначаються" (check button), які мудріше було б називати "галочками", і "радіо-кнопок" (radio button) - багатопозиційних перемикачів. Перші служать завдання логічних властивостей, тобто. мають два значення. Другі служать аналогічної мети, але безліч значень у разі звичайно і містить більше двох елементів. При цьому форма графічного уявленняоб'єкта типу XmToggleButton залежить від того, чи він використовується як "галочка" або "радіо" кнопка.

Як правило, widget класу XmToggleButton об'єднуються в конструкції, які називаються, відповідно, блок кнопок (check box) і блок радіо-кнопок (radio box). Ці блоки, своєю чергою, представляють модифікації об'єктів класу XmRowColumn, описаного нижче.

XmCascadeButton. Об'єкти даного класу є натискними кнопками і використовуються при створенні меню. Під час натискання на об'єкт з'являється підменю наступного рівня.

XmList. Представники даного класу – це одні з найцікавіших об'єктів Motif. Вони призначені для показу списку рядків і дають можливість зробити різні дії з елементами списку. Користувач може вибрати один або кілька рядків, які представлені в цьому об'єкті, при цьому вони підсвічуються. Крім того, якщо список має фокус введення, то один із його елементів виділяється пунктирною рамкою. Цю рамку називають курсором списку.

XmScrollBar. Об'єкти даного класу - смуги прокручування (скролл-бари), як правило, використовуються в сукупності з іншими об'єктами, такими як список (XmList), текст (XmText) та іншими. Скролл-бар призначений для прокручування області, якщо представлена ​​в ній інформація (список, текст, малюнок тощо) не може бути показана у вікні повністю. Об'єкти класу XmScrollBar є смугою (горизонтальну або вертикальну), по краях якої знаходяться кнопки зі стрілками. Натискання на якусь із них призводить до прокручування в напрямку вказаному стрілкою. На самій смужці скролл-бару розташовується повзунок (бігунок) - виділений прямокутник. Якщо "зачепити" його мишею і "тягнути", то це, як правило, також призводить до прокручування області.

XmSeparator. Об'єкти даного класу – роздільники – використовуються, як правило, з метою покращення зовнішнього вигляду вікон програми. Такий widget являє собою вертикальну або горизонтальну смужку(лінію), що поділяє групи об'єктів. Наприклад, роздільники можуть застосовуватися в меню для відокремлення одних команд від інших, у діалогах - відокремлюючи групу кнопок від інших елементів і т.д.

XmText. Об'єкти цього класу дозволяють відобразити один або кілька рядків тексту. Якщо рядки не поміщаються у вікні, зображення можна прокручувати вліво-вправо і вгору-вниз. Текст можна редагувати - режим редагування може змінюватись відповідною установкою ресурсів об'єктів.

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

XmTextField. Об'єкти цього класу дозволяють переглядати та редагувати один рядок тексту.

Клас XmManager. Цей клас є абстрактним, тобто. не використовується для створення об'єктів. Він визначає базові параметри, необхідні для побудови класів widget, які можуть керувати іншими об'єктами. Ці ресурси потрібні для правильного відображення дочірніх widget та керування отриманням ними фокусу введення.

Клас XmManager містить:

XmBulletinBoard. Об'єкти даного класу можуть мати подібні об'єкти, які розміщуються у вікні довільним чином. Координати вікон дочірніх widget вимірюються в системі координат, початок якої знаходиться у верхньому лівому куті вікна об'єкта класу XmBulletinBoard.

При зміні розміру об'єкта, наприклад, за допомогою миші, початкове розташування подібних об'єктів або не змінюється, або вони переміщаються так, щоб уникнути взаємоперетину. Якщо вікно widget стає меншим, то частини подібних об'єктів можуть стати невидимими.

Клас XmBulletinBoard містить:

XmForm. Відмінна риса об'єктів даного класу (форм) - можливість управління розташуванням своїх подобъектов рахунок завдання зв'язків як між самою формою і дочірньої widget, і між самими подобъектами.

Для кожної дочірньої widget можна вказати, до чого прив'язаний її лівий, правий, нижній або верхній край. Так, якщо лівий і правий краї подоб'єкта прив'язати до правого краю форми, то відстань від них до цього краю завжди залишатиметься тим самим. Якщо розмір форми зменшиться, то подобъект зрушить вліво, і якщо розмір збільшиться, то - вправо. Можна прив'язати один подібний до іншого. Тоді зміна положення подібного об'єкта, до якого прив'язаний widget, призведе до переміщення прив'язаного об'єкта так, щоб відстань між ними збереглася.

При зміні розмірів форми всі зв'язок між її подобъектами зберігаються.

XmSelectionBox. Об'єкти даного класу ("блоки вибору") представляють приклад складової widget і включають список, що прокручується, де користувач може вибрати потрібний йому елемент, а також текстове поле (об'єкт XmTextField), де відображається обраний у списку пункт. Користувач може редагувати зроблений вибір. Список і текстове поле можуть мати пояснювальні написи, що задаються за допомогою відповідних widget класу XmLabel. Об'єкт класу XmSelectionBox включає також і три кнопки (об'єкти XmPushButton). За замовчуванням на них нанесені написи "Ok", "Cancel" та "Help". І, нарешті, є ще один елемент - кнопка, що натискається, що має за замовчуванням назву "Apply". Спочатку даний подобъект створюється, але не входить у список керованих (managed) widget.

Використовуючи блок вибору, користувач може вказати потрібний йому підрядок у списку або ввести його в текстове поле. Налаштування підтверджуються натисканням кнопки "OK".

Клас XmSelectionBox включає:

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

XmFileSelection. Об'єкти цього класу дозволяють переглядати поточний вміст різних директорій та вибрати той чи інший файл.

Об'єкти цього класу містять елементи:

* 2 текстові поля: "Filter" і "Selection" (об'єкти класу XmNextField);

* 2 списки: "Directories" та "Files" (об'єкти класу XmList);

* 4 кнопки: "Ok", "Filter", "Cancel" і "Help" (об'єкти класу XmPushButton);

Текстове поле "Filter" задає маску (шаблон), для відбору з безлічі файлів деякого підмножини, що задовольняють умові, що задається в цьому полі - підходять під шаблон - саме це підмножина і показується в списку "Files". У списку "Directories" відображаються піддиректорії поточного каталогу. У текстовому полі "Selection" відображається файл (його назва), вибраний у списку "Files", і в це текстове поле користувач може ввести і повне ім'я потрібного йому файлу вручну. Чотири кнопки, що натискаються, використовуються для здійснення різних дій:

Ok – вибір заданого файлу;

Filter - оновлення списку файлів, що відображається у текстовому полі "Files", відповідно до поточної маски;

Cancel – закриває вікно widget, вибір файлу не відбувається;

Help - поклик про допомогу.

XmMessageBox. Об'єкти цього класу призначені для видачі користувачеві повідомлень, що виникають у процесі роботи програми. Цей widget є складовим. Він має область, де відображається рядок тексту (повідомлення) і спеціальна піктограма, що характеризує тип повідомлення. Крім цього, в об'єкті є три кнопки, що натискаються. За замовчуванням на них нанесені написи: "Ok", "Cancel" та "Help".

XmDrawingArea. Об'єкти даного класу надають програмі вікно для малювання та відображення інформації. У самому класі не передбачені параметри, які можна безпосередньо застосовувати для виведення графіки. Але наявні в цьому класі списки сallback-процедур дозволяють отримувати сповіщення про необхідність перемалювання вікна widget і отримання фокусу введення.

XmFrame. Об'єкти даного класу використовуються для того, щоб виділити деякі об'єкти серед інших, обвівши їх рамкою. Особливість widget даного класу полягає в тому, що вони можуть мати та керувати лише одним подоб'єктом.

XmPanedWindow. Об'єкти цього класу можуть об'єднувати різноманітні widget. Подобъекты відокремлюються один від одного, і між ними міститься спеціальний елемент, який має назву sash. Він виглядає як маленький квадрат, і використовується для зміни розмірів дочірніх widget. Так, якщо об'єкт класу XmPanedWindow має два подоб'єкти, то можна зробити наступне: "зачепити" sash мишкою і "відтягнути" його в потрібну сторону (вниз-вгору або вліво-вправо) - при цьому поздовжній розмір (розмір уздовж напрямку, в якому був "відтягнутий" sash) одного дочірнього об'єкта збільшиться "за рахунок" іншого (розмір іншого зменшиться), поперечні розміри обох подоб'єктів збережуться. "Поперечний" розмір об'єкта класу XmPanedWindow визначається максимальним аналогічним розміром його подібних об'єктів.

XmRowColumn. Об'єкти цього класу можуть об'єднувати різноманітні widget. Подобъекты розташовуються у порядку - як матриці. widget класу XmRowColumn є основою для створення наступних об'єктів:

check box - "блок кнопок, що відзначаються" (тобто об'єктів класу XmToggleButton або класу XmToggleButtonGadget); серед наявних у "блоці" кнопок одночасно може бути обрано ("включено") кілька;

radio box - "блок радіо-кнопок" (тобто об'єктів XmToggleButton або XmToggleButtonGadget); серед наявних у "блоці" кнопок одночасно може бути обрана ("включена") лише одна;

pulldown menu - "випадаюче меню" - вікно підменю, яке з'являється після вибору кнопки меню верхнього рівня (menu bar); пункти меню розміщуються вертикально;

option menu – кнопка з асоційованим меню; при натисканні на кнопку виникає вікно меню, з якого вибирається значення параметра; пункти меню розміщуються вертикально;

popup menu - спливаюче меню, яке, як правило, викликається натисканням на третю кнопку мишки; вікно меню з'являється там, де знаходиться її курсор; пункти меню розміщуються вертикально;

menu bar - меню верхнього рівня, що містить ряд кнопок (об'єктів класу XmCascadeButton або XmCascadeButtonGadget), які використовуються для виклику різних підменю (pulldown menu); пункти меню розміщуються горизонтально.

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

XmScrolledWindow. Об'єкт даного класу надає можливість виводити та переглядати деяку інформацію (текст, малюнок, список). Такий widget, як правило, містить подобъект, в якому розташовані дані, призначені для перегляду (це може бути об'єкт класу XmText, XmDrawingArea та ін.) зручного переглядуданих можуть використовуватися горизонтальні та вертикальні смугипрокручування.

Цей клас містить підклас

XmMainWindow. Об'єкти даного класу представляють окрему компоненту інтерфейсу, що складається, як правило, з наступних частин:

* меню верхнього рівня,

* вікно команд,

* "робоча область,

* вікно повідомлень,

* і два скролл-бари (горизонтальний та вертикальний).

Подіб'єкти можуть бути розділені сепараторами.

Класи XmMenuShell та XmDialogShell. Motif передбачає клас XmMenuShell об'єктів для створення різних меню. Цей клас успадковується від класу OverrideShell (з Xt).

Як уже згадувалося при описі Xt, клас TransientShell використовується для створення об'єктів програми, які з одного боку безпосередньо контактують з менеджером вікон, а з іншого боку, мають особливості, що відрізняють їх від звичайних вікон верхнього рівня. Основною з цих особливостей є те, що widget класу TransientShell не можна мінімізувати. Але вони забираються з екрана, якщо на піктограму перетворюється батько. Такі widget, як правило, використовуються для створення допоміжних вікон програми.

Motif використовує зазначені властивості класу TransientShell та розвиває їх у похідному класі XmDialogShell. Останній служить як shell-об'єкт діалогу.

Структуру діалогового вікна Motif може представити таким чином:

Об'єкт класу XmDialogShell

Об'єкт підкласу XmManager, наприклад, XmBulletinBoard або XmForm

Різноманітні керуючі елементи: кнопки, поля введення тексту тощо.

Бібліотека має набір процедур, що полегшують створення описаної конструкції.

Діалоги

Як було зазначено, конструкція діалогового вікна Motif наступна: спочатку йде об'єкт класу XmDialogShell, в який потім включається widget одного з підкласів класу XmManager, цей об'єкт використовується для розміщення різноманітних об'єктів.

У бібліотеці передбачаються спеціальні процедури створення діалогів. Вони різняться за типом widget, що є дочірньою по відношенню до об'єкта класу XmDialogShell.

Виведення тексту

У бібліотеці досить багато widget, які використовуються для відображення текстової інформації. Це XmLabel з підкласами, XmText та ін. Для завдання можливих шрифтів, які можна застосовувати під час малювання рядків, використовується ресурс XmNfontlist. Він має тип XmFontlist. Значення його - безліч пар "шрифт"/"тег шрифту".

Теги призначені для того, щоб зробити програми незалежними від конкретних шрифтів, що задаються користувачем. Робиться це так: програма створюється так, що у всіх функціях, що працюють з рядками тексту, присутні не самі шрифти, а їх мітки. Коли завдання скомпільовано та стартує, визначається відповідність між тэгами та конкретними шрифтами. Останні та використовуються для малювання.

Motif має кошти як роботи з рядками текстів, виведеними єдиним шрифтом, а й дозволяє працювати з такими об'єктами, як " складові рядки " - тобто. рядками тексту, де використовується багато шрифтів. Є набір засобів для створення таких рядків, роботи з ними та перетворення їх до звичайних, "одношрифтових", рядків.

Робота із зображеннями

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

Управління фокусом уведення

Motif підтримує дві моделі передачі фокусу введення. Перша їх неявна (pointer): фокус віддається тієї widget, у якому переміщається курсор миші. Друга модель – явна (explicit): для передачі фокусу треба помістити курсор миші у вікно widget та натиснути на ліву кнопку миші. Коли widget або gadget отримують фокус введення, їхня межа підсвічується.

Крім цих моделей передачі та отримання фокусу введення існує ще механізм передачі фокусу введення від однієї widget до іншої. Об'єкти можуть бути об'єднані в групи - це може бути завданням необхідних значень відповідних ресурсів, а може бути віддано на відкуп системі. У разі Motif автоматично пов'язує widget, використовуючи вбудовані правила. Так, наприклад, об'єкт класу XmMessageBox містить три групи: одна - "основний" об'єкт діалогу (клас XmForm), друга - "мітка", в якій представлено повідомлення користувачу, третя - кнопки, що натискаються.

Фокус введення передається як від одного об'єкта (у групі) до іншого, так і від групи до групи.

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

Motif також надає низку процедур, за допомогою яких можна керувати фокусом введення.

Lesstif Нещодавно вийшов freeware аналог Motif, повністю з ним сумісний. Він називається Lesstif. Його можна вільно отримати у вихідному та скомпілюваному для різних платформ вигляді в Internet.

Tk/tcl

Tcl - читається: - Розшифровується: "tool command language" (інструментальна командна мова). Складається із двох частин: власне мови та бібліотеки.

Мова tcl має простий синтаксис, програмувати на ньому легко. У вихідному вигляді tcl - це інтерпретатор. Дозволяє створювати нові конструкції, як функції або програми, що надає вмілому програмісту потужний інструментрозробки не тільки кінцевих додатків, а й свого власного розширення мови tcl, створення та підтримки свого власного стилю.

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

Tk являє собою Motif-сумісний інструментарій (toolkit) для розробки графічних інтерфейсів в середовищі X Window. Крім стандартного інтерфейсу з C і C++, він включає інтерфейс з tcl, надаючи можливість використовувати засоби Tk з інтерпретатора команд tcl. Це означає, що крім стандартного програмування на C і C++, інтерфейсні частини програми можуть бути реалізовані у вигляді скриптів мовою tcl і ці інтерфейсні частини (діалоги, планування екранів і т.д.) можна керувати динамічно, під час роботи кінцевої програми, використовуючи команди tcl.

Віконне середовище "wish" дозволяє створювати додатки з графічними інтерфейсами, користуючись тільки засобами мови tcl.

Подібні документи

    Системи програмування та його графічні можливості. Розробка мультимедіа курсу, що сприяє ефективному засвоєнню учнями базової школи теми "Графічні можливості мови програмування" (з прикладу мов програмування Basic та Pascal).

    дипломна робота , доданий 29.12.2010

    Графічні компоненти екрана, системні об'єкти та функції. Система засобів взаємодії користувача із пристроєм. Історія графічних інтерфейсів персональних комп'ютерів, їх класифікація. Віконна система X Window System.

    презентація , доданий 22.05.2012

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

    лабораторна робота, доданий 01.12.2011

    Векторна графіка. Графічні примітиви. Графічні можливості мови програмування Pascal. Методичні поради до вивчення графіки в мові програмування Pascal. Побудова графіків функций.

    курсова робота , доданий 13.06.2007

    Розробка програми для операційної системи Windows із використанням VisualC++ (6.0, .NET). Розгляд основ програмного моделюванняроботи приладу (електричного чайника) Правила створення класів пристрою та його графічного інтерфейсу.

    курсова робота , доданий 03.06.2014

    Комп'ютерна графіка. Подання графічної інформації на комп'ютері. Графічні формати. Графічні редактори. Векторна графіка. CorelDraw. Характеристика програми та інтерфейсу. Технологічні можливості та використання програми CorelDraw.

    курсова робота , доданий 19.05.2007

    Роль розподілених обчислювальних систему вирішенні сучасних завдань. Інструментальна система DVM для розробки паралельних програм. Кошти побудови формальної моделі графічного інтерфейсу. Вимоги до графічного інтерфейсу системи DVM.

    курсова робота , доданий 15.10.2010

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

    курсова робота , доданий 16.12.2011

    Сфери застосування машинної графіки. Види комп'ютерної графіки. Колірна роздільна здатність та колірні моделі. Програмне забезпечення для створення, перегляду та обробки графічної інформації. Графічні можливості текстових процесорів, графічні редактори.

    контрольна робота , доданий 07.06.2010

    Еволюція графічних інтерфейсів. Пристрій системи X Window та менеджери вікон. Опис робочого столу та програми KDE та GNOME. Огляд основних принципів організації інтерфейсу системі Windowsопис пакета її прикладних програм.